如何在TokenEndPoint Spring oAuth2中注入WebResponseExceptionTranslator [英] How to inject WebResponseExceptionTranslator in TokenEndPoint Spring oAuth2
问题描述
我正在尝试自定义Spring Security oAuth TokenEndpoint类处理异常的方式。我想返回一个比DefaultWebResponseExceptionTranslator当前更自定义的JSON响应。我无法弄清楚如何通过XML注入自定义转换器。以下是我的代码片段:
I am trying to customize the way the Spring Security oAuth TokenEndpoint class handles exceptions. I want to return a more customized JSON response than the DefaultWebResponseExceptionTranslator currently does. I cannot figure out how to inject a custom Translator via XML. Here are my code snippets:
spring-security.xml
spring-security.xml
<oauth:authorization-server
client-details-service-ref="clientDetails" token-services-ref="tokenServices"
user-approval-handler-ref="userApprovalHandler" request-validator-ref="requestValidator" >
<oauth:client-credentials />
<oauth:password />
</oauth:authorization-server>
以下是AbstractServerBeanDefinitionParser的相关代码部分
Here is the relevant code portion of AbstractServerBeanDefinitionParser
BeanDefinitionBuilder tokenEndpointBean = BeanDefinitionBuilder.rootBeanDefinition(TokenEndpoint.class);
tokenEndpointBean.addPropertyReference("clientDetailsService", clientDetailsRef);
tokenEndpointBean.addPropertyReference("tokenGranter", tokenGranterRef);
authorizationEndpointBean.addPropertyReference("oAuth2RequestValidator", oAuth2RequestValidatorRef);
parserContext.getRegistry()
.registerBeanDefinition("oauth2TokenEndpoint", tokenEndpointBean.getBeanDefinition());
if (StringUtils.hasText(oAuth2RequestFactoryRef)) {
tokenEndpointBean.addPropertyReference("oAuth2RequestFactory", oAuth2RequestFactoryRef);
}
if (StringUtils.hasText(oAuth2RequestValidatorRef)) {
tokenEndpointBean.addPropertyReference("oAuth2RequestValidator", oAuth2RequestValidatorRef);
}
TokenEndpoint扩展了AbstractEndpoint,它是定义翻译器的地方。
TokenEndpoint extends AbstractEndpoint which is where the translator is defined.
@FrameworkEndpoint
public class TokenEndpoint extends AbstractEndpoint {
@ExceptionHandler(Exception.class)
public ResponseEntity<OAuth2Exception> handleException(Exception e) throws Exception {
logger.info("Handling error: " + e.getClass().getSimpleName() + ", " + e.getMessage());
return getExceptionTranslator().translate(e);
}
以下是来自AbtractEndpoint的片段
Here is a snippet from AbtractEndpoint
public class AbstractEndpoint implements InitializingBean {
protected final Log logger = LogFactory.getLog(getClass());
private WebResponseExceptionTranslator providerExceptionHandler = new DefaultWebResponseExceptionTranslator();
public void setProviderExceptionHandler(WebResponseExceptionTranslator providerExceptionHandler) {
this.providerExceptionHandler = providerExceptionHandler;
}
所以我的问题是。如何调用setProviderExceptionHandler通过我的spring-security.xml传递我的自定义类?
So my question is. How do I call the setProviderExceptionHandler to pass in my custom class via my spring-security.xml?
推荐答案
为了定制spring -oauth的异常处理程序你必须定义的实例WebResponseExceptionTranslator
:
In order to customize spring-oauth's exceptions handler you have to define an instance of WebResponseExceptionTranslator
:
@Bean
public WebResponseExceptionTranslator webResponseExceptionTranslator() {
return new DefaultWebResponseExceptionTranslator() {
@Override
public ResponseEntity<OAuth2Exception> translate(Exception e) throws Exception {
ResponseEntity<OAuth2Exception> responseEntity = super.translate(e);
OAuth2Exception body = responseEntity.getBody();
HttpHeaders headers = new HttpHeaders();
headers.setAll(responseEntity.getHeaders().toSingleValueMap());
// do something with header or response
return new ResponseEntity<>(body, headers, responseEntity.getStatusCode());
}
};
}
并将其传递给 exceptionTranslator
configurer的属性。我使用了基于注释的配置,看起来像这样:
and pass it to exceptionTranslator
property of configurer. I used annotation-based configuration so it looks like that:
@Configuration
@EnableAuthorizationServer
public class OAuth2ServerConfiguration extends AuthorizationServerConfigurerAdapter {
// some config
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.pathMapping("/oauth/authorize", "/authorize")
.pathMapping("/oauth/error", "/error")
.exceptionTranslator(webResponseExceptionTranslator())
;
}
}
只需查看< oauth:authorization-server />
,基于xml的配置。
Just check which properties available for <oauth:authorization-server />
with xml-based configuration.
这篇关于如何在TokenEndPoint Spring oAuth2中注入WebResponseExceptionTranslator的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!