【问题标题】:How to inject WebResponseExceptionTranslator in TokenEndPoint Spring oAuth2如何在 TokenEndPoint Spring oAuth2 中注入 WebResponseExceptionTranslator
【发布时间】:2015-12-30 23:25:54
【问题描述】:

我正在尝试自定义 Spring Security oAuth TokenEndpoint 类处理异常的方式。我想返回比 DefaultWebResponseExceptionTranslator 当前更自定义的 JSON 响应。我无法弄清楚如何通过 XML 注入自定义翻译器。这是我的代码 sn-ps:

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 的相关代码部分

    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,这是定义翻译器的地方。

@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 的 sn-p

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 传入我的自定义类?

【问题讨论】:

  • 你得到答案了吗???

标签: java spring spring-security oauth-2.0 spring-security-oauth2


【解决方案1】:

为了自定义 spring-oauth 的异常处理程序,你必须定义一个 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 属性。我使用了基于注释的配置,所以它看起来像这样:

@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())
        ;
    }
}

只需使用基于 xml 的配置检查哪些属性可用于 &lt;oauth:authorization-server /&gt;

【讨论】:

  • @bgme_one 当通过 XML 配置授权服务器时,你有什么想法吗???
猜你喜欢
  • 2016-11-12
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2018-10-25
  • 2015-10-19
  • 2016-12-28
  • 2017-03-01
相关资源
最近更新 更多