gpt4 book ai didi

java - 未使用自定义 DefaultTokenServices bean

转载 作者:行者123 更新时间:2023-11-30 02:14:17 25 4
gpt4 key购买 nike

我有一个使用 JWT 和 OAuth2 的 Spring Boot Rest API

Spring Boot 1.5.10 使用 spring security starter 以及 oauth2 和 jwt 模块的默认版本。

在我的授权服务器配置中,我根据此处的指南声明自定义 DefaultTokenServices http://www.baeldung.com/spring-security-oauth-jwt

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

@Autowired
private AuthenticationManager authenticationManager;

@Autowired
private UserDetailsService userDetailsService;

@Autowired
private DataSource dataSource;

@Value("${tokenSigningKey:sdf8234kjdhgD}")
private String tokenSigningKey;

@Bean
public JwtAccessTokenConverter accessTokenConverter() {
CustomJwtAccessTokenConverter accessTokenConverter = new CustomJwtAccessTokenConverter();
accessTokenConverter.setSigningKey(tokenSigningKey);
return accessTokenConverter;
}

@Bean
public TokenStore tokenStore() {
return new CustomJwtJdbcTokenStore(accessTokenConverter(), dataSource);
}

@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
defaultTokenServices.setSupportRefreshToken(true);
return defaultTokenServices;
}

@Bean
public TokenEnhancer tokenEnhancer() {
return new CustomAccessTokenEnhancer();
}

@Bean
public PasswordEncoder passwordEncoder() {
return new CustomPasswordEncoder();
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.jdbc(dataSource).passwordEncoder(passwordEncoder());
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), accessTokenConverter()));
endpoints
.tokenStore(tokenStore())
.tokenEnhancer(tokenEnhancerChain)
.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService);
}

@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.passwordEncoder(passwordEncoder());
security.checkTokenAccess("isAuthenticated()");
}

}

但是,实际使用的 DefaultTokenServices 是在 AuthorizationServerEndpointsConfigurer 中在幕后构建的

这是该类的相关代码

public AuthorizationServerTokenServices getDefaultAuthorizationServerTokenServices() {
if (defaultTokenServices != null) {
return defaultTokenServices;
}
this.defaultTokenServices = createDefaultTokenServices();
return this.defaultTokenServices;
}

private DefaultTokenServices createDefaultTokenServices() {
DefaultTokenServices tokenServices = new DefaultTokenServices();
tokenServices.setTokenStore(tokenStore());
tokenServices.setSupportRefreshToken(true);
tokenServices.setReuseRefreshToken(reuseRefreshToken);
tokenServices.setClientDetailsService(clientDetailsService());
tokenServices.setTokenEnhancer(tokenEnhancer());
addUserDetailsService(tokenServices, this.userDetailsService);
return tokenServices;
}

我在网上遇到了一个答案,建议在 public void configure(AuthorizationServerSecurityConfigurer security) 方法中设置 DefaultTokenServices ,但是当我这样做时,它确实使用了我的自定义 bean,但由于某种原因,它生成的 token 不是 JWT 格式,它似乎使用 token 的默认简单格式。我只是不知道为什么它不使用我的自定义 bean,因为在我遵循的指南中它没有以这种方式声明。有什么想法吗?

最佳答案

我昨天也遇到了同样的情况。实际上,您需要将 DefaultTokenServices 添加到端点。之所以没有采用 JWT 格式,是因为默认情况下不添加该格式。您需要将 JWT 格式 bean 添加到 DefaultTokenServices 中。

此外,您需要执行的操作与 AuthorizationServerEndpointsConfigurercreateDefaultTokenServices() 中生成 DefaultTokenServices 的操作大致相同,只需替换您需要的详细信息。这是您需要添加到授权服务器配置中的相关代码:

@Bean
@Primary
public DefaultTokenServices tokenServices(TokenEnhancerChain tokenEnhancerChain, ClientDetailsService clientDetailsService) {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
defaultTokenServices.setSupportRefreshToken(true);
defaultTokenServices.setTokenEnhancer(tokenEnhancerChain);
defaultTokenServices.setClientDetailsService(clientDetailsService);
addUserDetailsService(defaultTokenServices,userDetailsService);
return defaultTokenServices;
}

private void addUserDetailsService(DefaultTokenServices tokenServices, UserDetailsService userDetailsService) {
if (userDetailsService != null) {
PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider();
provider.setPreAuthenticatedUserDetailsService(new UserDetailsByNameServiceWrapper<PreAuthenticatedAuthenticationToken>(
userDetailsService));
tokenServices
.setAuthenticationManager(new ProviderManager(Arrays.<AuthenticationProvider> asList(provider)));
}
}

并将 tokenServices 方法添加到授权服务器配置的配置方法中:

    @Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), accessTokenConverter()));
endpoints
.tokenStore(tokenStore())
.tokenEnhancer(tokenEnhancerChain)
.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService)
.tokenServices(tokenServices(tokenEnhancerChain,endpoints.getClientDetailsService()));
}

这对我有用。如果您遇到任何问题,请告诉我。

关于java - 未使用自定义 DefaultTokenServices bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49077401/

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