在 Spring security OAUTH 中定义多个 TokenStore(s)

Posted

技术标签:

【中文标题】在 Spring security OAUTH 中定义多个 TokenStore(s)【英文标题】:Define multiple TokenStore(s) in Spring secuirty OAUTH 【发布时间】:2017-06-01 10:57:20 【问题描述】:

我有一个 Spring Security AuthorizationServerConfigurerAdapter 配置,它支持密码和 refresh_token 授权类型。

clients
        .inMemory()
        .authorizedGrantTypes("password", "refresh_token")
        ...;

我使用的TokenStoreJwtTokenStore,因此当我使用DefaultTokenServices 时,refresh_token 和 access_token 生成为 JWT

问题是我怎样才能让 JdbcTokenStore 生成和管理 refresh_token 而 access_token 仍然由 JwtTokenStore 生成和管理?

我曾考虑过扩展DefaultTokenServices 或实现AuthorizationServerTokenServices,但我不确定默认的spring-secuirty 配置是否提供任何其他方式。

谢谢!

【问题讨论】:

【参考方案1】:

实现存储令牌(访问令牌和刷新令牌)并同时拥有 JWT 编码令牌的一种方法是为令牌存储提供 tokenEnhancer 类型为 JwtAccessTokenConverter

@Bean
protected TokenStore tokenStore() 
    return new InMemoryTokenStore();


@Bean
protected JwtAccessTokenConverter jwtTokenEnhancer() 
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    converter.setSigningKey(privateKey);
    converter.setVerifierKey(publicKey);
    return converter;


@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception 
    clients.inMemory().withClient("client_trusted")//...
    ;


@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception 
    endpoints.tokenStore(tokenStore())
        .tokenEnhancer(jwtTokenEnhancer()) // <- tokens are encoded in JWT
        .authenticationManager(authenticationManager)
        .userDetailsService(userDetailsService);
    

通过这种方法,您可以轻松撤销(或删除)refresh_token。因此授权服务器不会在下一次刷新令牌请求中提供新的访问令牌。 JWT 中的信息保持自包含,资源服务器无需与授权服务器交互即可工作。

@Autowired
protected TokenStore tokenStore;

@RequestMapping(method = RequestMethod.POST, value = "/revoke")
public void revokeToken(@RequestParam String token) 
    ((InMemoryTokenStore)tokenStore).removeRefreshToken(token);

这里是带有js客户端的授权和资源服务器的完整示例:https://github.com/pufface/spring-oauth-jwt-demo

【讨论】:

这是否意味着,在调用(通过“注销”操作)((InMemoryTokenStore)tokenStore).removeRefreshToken(token);之后,这个refreshToken就不能再用来获取新的accessToken了? ----我会试一试的! tokenStore 是否需要声明为 bean(例如,在 github.com/pufface/spring-oauth-jwt-demo/blob/master/… 类中)?我之所以问,是因为我认为它不是一个 bean,因为它只是在 java 配置中用于设置另一个对象(configure(AuthorizationServerEndpointsConfigurer) 方法中的endpoints),因此可能只是一个没有 @ 的方法987654330@注解。

以上是关于在 Spring security OAUTH 中定义多个 TokenStore(s)的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Oauth、SAML 和 spring-security 的多租户的情况下从 spring-security.xml 中获取错误

Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core

社交登录,spring-security-oauth2 和 spring-security-jwt?

Spring Security 解析 —— Spring Security Oauth2 源码解析

如何在 spring-security-oauth 中获取经过身份验证的用户

注销在Spring Security OAuth2中无法正常运行