spring security oauth2 认证端异常处理(基于前后分离统一返回json)
发布网友
发布时间:2023-01-06 14:50
我来回答
共1个回答
热心网友
时间:2023-07-17 13:21
在默认的情况下,spring security oauth2 在发生异常情况下,返回的格式并不符合现实需要,其格式是:
我们一般需要是这种格式
对于oauth2的异常,其类主要是 OAuth2Exception ,默认处理这些异常的是DefaultWebResponseExceptionTranslator,其错误主要是包含oauth2相关的错误,就类似以下的。
DefaultWebResponseExceptionTranslator处理的OAuth2Exception,其类可见的序列化器如下,可以得出默认的返回格式:
所以我们需要重新定义自己的WebResponseExceptionTranslator,以及自己的oauth2异常以及其序列化器(也可以不定义,重写handleOauth2Exception即可)
自定义oauth2异常处理类,CustomWebResponseExceptionTranslator,模仿DefaultWebResponseExceptionTranslator即可,下面给出关键部分,注意result是自己定义返回格式的bean,含有msg和code。最后在认证服务器配置一下就可。
这里说的是oauth2的异常处理,其中还有认证的异常,我们这里使用basic的认证方式,如果发生异常,是不会走这个自定义的异常处理器的,所以在securityConfig中配置,在httpBasic后面配置的那里处理了。
这里加上 http.addFilterBefore(customBasicAuthenticationFilter, BasicAuthenticationFilter.class);
这个filter其实就是验证一些必要参数有无缺失,并且返回自定义的格式,
还有需要注意是:因为是授权码模式,在获取token的时候,需要传clientId和clientSecret,这是获取token的验证我们需要先于一步再到后面,所以我们会定义个过滤器处理,因为在测试过程,如果不先于验证clientId和clientSecret,返回的错误可能不是预期之中的,这里还不清楚为啥会出现那些特殊情况,所以还是先于一步先校验了、
认证服务器配置上自定义的filter,这个filter会先执行再到后面/oauth2/token链接,还有这里不开启allowFormAuthenticationForClients,还是只限于basic,如果开启了,有可能返回不正确的异常格式,具体原因不明,但后续肯定是不走basicFilter的,自定义的filter还是验证参数完整性和认证clientId和clientSecret身份是否正确。
例示参考:
https://blog.csdn.net/qq_31063463/article/details/83752459