gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:56:57 28 4
gpt4 key购买 nike

我有一个支持密码和刷新 token 授权类型的 Spring Security AuthorizationServerConfigurerAdapter 配置。

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

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

问题是如何让 JdbcTokenStore 生成和管理 refresh_token,而 JwtTokenStore 生成和管理 access_token?

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

谢谢!

最佳答案

一种方法,要实现存储 token (访问 token 和刷新 token )并同时拥有 JWT 编码 token ,为 token 存储提供类型为JwtAccessTokenConvertertokenEnhancer >.

@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。因此授权服务器不会在下一次刷新 token 请求时提供新的访问 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

关于java - 在 Spring security OAUTH 中定义多个 TokenStore(s),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41696124/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com