Spring Oauth异常消息的国际化

时间:2014-08-17 23:01:37

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

是否可以将Spring Oauth2错误消息本地化?特别是InvalidGrantException和UsernameNotFoundException的错误消息。

1 个答案:

答案 0 :(得分:0)

也许现在为时已晚,但要留下我的答案,以便其他人感兴趣。

据我所知,Spring OAuth2中没有内置的国际化功能(如果我错了,请纠正我)。但是,Spring允许我们扩展默认实现来实现它。我猜有两种可能的方法:

<强> 1。后端

将您的错误消息国际化,并将其返回给API。这需要区域设置解析(例如标题区域设置解析)

<强> 2。后端+前端

将附加的错误代码附加到您的回复中,并且前端需要将它们映射到本地化消息。

我们的想法是实现一个自定义TokenGranter,并在验证时将AuthenticationException转换为您自己的异常(例如InvalidGrantException)。

下面的示例为不同类型的invalid_grant (appoache#2)创建了不同的错误代码:

    public class CustomTokenGranter extends AbstractTokenGranter {

        private static final String ERROR_CODE_KEY = "error_code";

        @Override
        protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) {
            try {
                ....
                authenticationManager.authenticate(...);
            } catch (AccountStatusException ase) {
                mapAndThrow(ase);
            } catch (BadCredentialsException e) {
                InvalidGrantException ige = new InvalidGrantException("Bad credentials");
                ige.addAdditionalInformation(ERROR_CODE_KEY, "01234");
                throw ige;
            }
        }


        private void mapAndThrow(AccountStatusException ase) {
            InvalidGrantException ige = new InvalidGrantException(ase.getMessage());
            if (ase instanceof DisabledException) {
                ige.addAdditionalInformation(ERROR_CODE_KEY, "01235");
            } else if (ase instanceof LockedException) {
                ige.addAdditionalInformation(ERROR_CODE_KEY, "01236");
            } else if (ase instanceof AccountExpiredException) {
                ige.addAdditionalInformation(ERROR_CODE_KEY, "01237");
            }
            // More goes here
            throw ige;
        }
    }

将自定义令牌分机注册到授权服务器:

@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenGranter(new CustomTokenGranter (...));
    }
}

回复示例:

{
    "error": "invalid_grant",
    "error_description": "User is disabled",
    "error_code": "01235"
}

如果您想采用方法#1 ,您可以执行与方法#2类似的操作,并通过从RequestContextHolder获取servlet请求来解决您的语言环境:

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes != null && requestAttributes instanceof ServletRequestAttributes) {
    HttpServletRequest sRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
    Locale locale = sRequest.getLocale(); ...
    // Resolve your error messages here from above obtained locale
}