春季安全性 OAuth2 不使用令牌会使属性中的值过期



我正在尝试将我的应用程序配置为从我的属性文件中提取访问和刷新令牌过期时间,而不是在 java 配置中设置它们。但是,它不会拾取它们,而是恢复为默认值。

这是我的 Java 配置示例,我在其中手动设置了过期值。当我这样做时,这很好用。

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    ....
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("myclient")
                .secret("mysecret")
                .authorizedGrantTypes("password", "refresh_token")
                .scopes("my-app")
                .autoApprove("my-app")
                .accessTokenValiditySeconds(30)
                .refreshTokenValiditySeconds(3200);
    }
}

但是,当我尝试像这样在我的application.properties文件中设置它们时,它不起作用。

# Security
security.oauth2.client.access-token-validity-seconds=60
security.oauth2.client.refresh-token-validity-seconds=3200

我希望这个回复还不算太晚...

遇到了同样的问题,后来我发现这是一个错误。

对于自动连线的客户端详细信息服务,它有一个例外:

Method threw 'org.springframework.beans.factory.BeanCreationException' exception. Cannot evaluate com.sun.proxy.$Proxy135.toString()

因此,clientDetailsService 的值为空。然后它将使用 defaul 值,因此您在 config 类中的值设置不起作用。但是如果你在application.yml中这样做,它将设置这个值而不检查clientDetailsService,所以它可以工作。

我已经向团队报告了此问题,希望有人可以解决此错误。https://github.com/spring-projects/spring-security-oauth/issues/1448

一个可能的解决方案是在 application.yml 文件中设置值,或者在 DefaultTokenServices 中设置值,如下所示:

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

也在寻找这个答案,并尝试了DeezCashews提出的解决方案。但它对我不起作用,因为有一部分代码首先检查此值是否在表 oauth_client_details access_token_validity列中设置,然后才从 tokenServices 中获取 greps 值。因此,如果您的"expires_in"设置oauth_client_details表中,那么您需要在那里更改它。

在 db 中检查有效性属性的代码:

    protected int getAccessTokenValiditySeconds(OAuth2Request clientAuth) {
    if (clientDetailsService != null) {
        ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId());
        Integer validity = client.getAccessTokenValiditySeconds();
        if (validity != null) {
            return validity;
        }
    }
    return accessTokenValiditySeconds;
}

最新更新