2014-09-20 85 views
1

如果我理解的oauth2规范正确,我应该能够添加自定义的内容,如一个USER_ID到的oauth2访问令牌。服务器然后可以解码访问令牌并将一个用户域对象添加到SecurityContextHolder。如何将内容添加到Spring oauth2访问令牌?

(当然,我可以添加USER_ID到每一个REST API方法,但是这将意味着大量的重构)从阅读中,我想我需要实现或者扩展TokenEnhancer手动

眼下。由于我使用的是JavaScript客户端,也许 我应该扩展JwtAccessTokenConverter?我在这条正确的道路上吗?

回答

1

第一,为什么你需要广告用户id的访问令牌,而你可以存储范围或additional_information您的数据,让我描述使用范围:

如果你的客户需要获得与访问的特定数据令牌你可以为范围PARAM发送到auth服务器,然后当访问重定向到托克重新导向网址,你会得到你把范围PARAM数据,这是之前和验证后用于用户的储存统计。

如果您希望此用户ID为别人而不是存储状态,我建议,使验证服务器提供用户的详细信息,并通过OAuth与访问令牌将其固定在端点的东西。

我不建议把任何数据生成访问令牌的,因为它可以在弱令牌的复杂性,也因此不建议您在令牌客户端进行解码。

+0

谢谢你的答案。我的想法是,服务器(终点)解码访问令牌,并与USER_ID的帮助下将用户添加到SecurityContextHolder的 – jack 2014-09-21 12:07:33

+0

检查访问令牌表的SQL它包含已经USER_NAME这样你就可以从数据库直接,明白了没有需要解码它。如果你的终端有这个数据库不能访问,可以auth服务器暴露基于访问令牌的用户配置文件,该请求由OAuth的固定上也做的端点。 – 2014-09-22 14:47:16

0
@Bean 
public TokenEnhancer tokenEnhancer() { 
    return new TokenEnhancer() { 
     @Override 
     public OAuth2AccessToken enhance(OAuth2AccessToken oAuth2AccessToken, OAuth2Authentication oAuth2Authentication) { 
      DefaultOAuth2AccessToken newToken = new DefaultOAuth2AccessToken(oAuth2AccessToken); 
      Map<String, Object> addInfo = new HashMap<>(); 
      // add here what u need 
      addInfo.put("putName", oAuth2Authentication.getName()); 
      newToken.setAdditionalInformation(addInfo); 
      return newToken; 
     } 
    }; 
} 

,并在AuthorizationServerConfiguration:

@Autowired 
private TokenEnhancer tokenEnhancer; 
... 
@Override 
public void configure(AuthorizationServerEndpointsConfigurer endpoints) 
     throws Exception { 
    endpoints 
      .tokenStore(this.tokenStore) 
      .authenticationManager(this.authenticationManager) 
      .userDetailsService(this.userDetailsService) 
      .tokenEnhancer(this.tokenEnhancer); 
} 
+0

如果你添加一个你的答案的小解释,以便我们理解你在做什么,那将是非常好的。 – sotoz 2017-05-14 17:18:51

相关问题