Spring Security OAuth2 不使用属性中的令牌过期值

Posted

技术标签:

【中文标题】Spring Security OAuth2 不使用属性中的令牌过期值【英文标题】:Spring Security OAuth2 not using token expire values from properties 【发布时间】:2018-04-27 19:48:29 【问题描述】:

我正在尝试将我的应用程序配置为从我的属性文件中提取访问权限和刷新令牌过期时间,而不是在 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

【问题讨论】:

您使用哪个版本的 Spring Boot?我在 Spring Boot 的源代码或文档中找不到这些属性。 我正在使用 spring boot 1.5.3 和 spring secuirty oauth2 2.2.0.13 您能否提供一个指向这些属性的文档的链接?我会说,这些属性不存在。 我只是基于 IntelliJ 自动完成它们并为它们显示文档这一事实。 那只是一个类。我在Common Application Properties 和OAuth2ClientProperties 中找不到该属性。 【参考方案1】:

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

检查数据库中有效性属性的代码:

    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;

【讨论】:

【参考方案2】:

希望这个回复还不算晚……

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

对于 ClientDetailsS​​ervice 的自动装配,它有一个例外:

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

所以clientDetailsS​​ervice的值为null。然后它将使用默认值,因此您在配置类中的值设置不起作用。但是如果你在application.yml中做,它会设置这个值而不检查clientDetailsS​​ervice,所以它可以工作。

我已经向团队报告了这个问题,希望有人可以解决这个错误。 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;

【讨论】:

以上是关于Spring Security OAuth2 不使用属性中的令牌过期值的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security Oauth2

Spring-Security OAuth2 设置 - 无法找到 oauth2 命名空间处理程序

Spring Security OAuth2 v5:NoSuchBeanDefinitionException:'org.springframework.security.oauth2.jwt.Jwt

针对授权标头的Spring Security OAuth2 CORS问题

OAuth2.0学习(4-1)Spring Security OAuth2.0 - 代码分析

Spring Security---Oauth2详解