[英]Spring Security OAuth2 not using token expire values from properties
我正在嘗試將我的應用程序配置為從我的屬性文件中提取訪問和刷新令牌過期時間,而不是在 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
我希望這個回復不會太晚......
我遇到了同樣的問題,后來我發現這是一個錯誤。
對於 ClientDetailsService 的自動裝配,它有一個例外:
Method threw 'org.springframework.beans.factory.BeanCreationException' exception. Cannot evaluate com.sun.proxy.$Proxy135.toString()
所以clientDetailsService的值為null。 然后它將使用默認值,因此您在 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 提出的解決方案。 但它對我不起作用,因為有一部分代碼首先檢查該值是否設置在列 access_token_validity 表 oauth_client_details 中,然后才檢查來自 tokenServices 的 grep 值。 因此,如果您的“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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.