java Spring Oauth2自定义异常处理程序
在基于Spring Security Oauth2的身份验证中,当客户端发送需要刷新的访问令牌时,DefaultTokenServices类抛出InvalidTokenException(参见第235行):
发生这种情况时的输出类似于:
{"error":"invalid_token","error_description":"Invalid access token: a0cb5ab9-7281-46bd-a9a2-796a04a906c9"
}
我想更改此输出,但我迷路了。其他一些答案建议设置一个自定义的异常渲染器,但这也不起作用,在这些情况下,我的自定义异常渲染器从未被调用
还有一种叫做异常翻译器的东西,但在任何情况下都没有被调用
我的spring配置的一部分:
<bean id="clientAuthenticationEntryPoint"
class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
<property name="typeName" value="Basic"/>
<property name="exceptionRenderer" ref="myExceptionRenderer" />
</bean>
<bean id="oauthAuthenticationEntryPoint"
class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
<property name="exceptionRenderer" ref="myExceptionRenderer" />
<property name="exceptionTranslator" ref="listyOauthExceptionTranslator" />
</bean>
<bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" >
<property name="exceptionRenderer" ref="myExceptionRenderer" />
<property name="exceptionTranslator" ref="myExceptionTranslator" />
</bean>
<bean id="myExceptionRenderer" class="com.example.exceptions.MyOauth2ExceptionRenderer" />
<bean id="myExceptionTranslator" class="com.example.exceptions.MyOauth2ExceptionTranslator" />
异常渲染器:
public class MyExceptionRenderer implements OAuth2ExceptionRenderer {
@Override
public void handleHttpEntityResponse(HttpEntity<?> responseEntity, ServletWebRequest webRequest) throws Exception {
System.out.println("Thrown exception");
}
}
我还添加了一个定制的异常映射器,它应该可以获取所有的异常,但是因为我假设它是另一个servlet,所以在这种情况下它实际上不起作用
@Provider
public class GenericExceptionMapper implements ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable ex) {
System.out.println("MAPPING EXCEPTION");
return Response.status(200).entity().build();
}
}
我可以捕捉到AuthenticationException的情况,但不能捕捉到任何InvalidTokenException
有什么帮助吗?Spring实际上在哪里捕获这个InvalidTokenException,如何设置它以便提供自定义输出
# 1 楼答案
InvalidTokenException扩展
ClientAuthenticationException
。因此,您可以通过扩展ClientAuthenticationException
来创建自己的异常,并抛出这个异常,而不是InvalidTokenException
就像
在InvalidTokenException引发的错误中
invalid_token
由InvalidTokenException的getOAuth2ErrorCode()
方法返回,Invalid access token: a0cb5ab9-7281-46bd-a9a2-796a04a906c9
是抛出异常时给出的消息如果你扔
错误将显示为
my_custom_exception
来自CustomException
的getOAuth2ErrorCode()
# 2 楼答案
这是我对自定义授权服务器和资源服务器异常的解决方案。也许会有帮助
Spring Security Oauth - Custom format for OAuth2Exceptions
# 3 楼答案
答案并不是真正提供自定义实现,自定义响应将是代码中的一个点,在这里我可以访问默认响应,并可以发送POJO而不是POJO,例如,如果您想将
error_description
更改为error_info
或其他任何内容,或者您可能想向响应添加更多变量。这个解决方案确实存在,但我认为实施起来很痛苦,至少可以这么说,因为我从here复制了它:# 4 楼答案
为了压倒
您需要继承ResourceServerConfigurerAdapter 并覆盖public void configure(最终资源服务器安全配置器配置)
示例代码