在 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")
...;
我使用的TokenStore
是JwtTokenStore
,因此当我使用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 源码解析