2017-07-30 133 views
0

我在我的應用程序上使用Spring Boot和Spring Security OAuth使用JDBC客戶端支持實現OAuth2。Springboot with Spring OAuth2

我可以生成令牌,當我做一個POST請求http://localhost:8080/oauth/token我得到這樣一個有效的響應:

{ 
    "access_token": "359e93b2-555a-477b-9a65-e5062314fc23", 
    "token_type": "bearer", 
    "refresh_token": "6fd1ae31-8129-4729-a86b-e756c453a58a", 
    "expires_in": 899, 
    "scope": "read" 
} 

現在的怪,這是,我不能在數據庫中找到任何地方該令牌。如果我向/ oauth/token發出另一個請求,我會得到相同的標記,但expires_in的值較低。我得出的結論是,這個令牌信息必須存儲在某個地方,但我找不到它。

01:24:41 SELECT * FROM dummy.oauth_access_token LIMIT 0, 1000 0 row(s) returned 0.000 sec/0.000 sec 

所有的OAuth相關的表是除了oauth_client_details其中有客戶的詳細信息生成令牌空。

這裏是我的代碼。

AuthServerOAuth2Config

@Configuration 
public class AuthServerOAuth2Config extends AuthorizationServerConfigurerAdapter { 

    private final AuthenticationManager authenticationManager; 
    private final AppConfig appConfig; 

    @Autowired 
    public AuthServerOAuth2Config(AuthenticationManager authenticationManager, AppConfig appConfig) { 
     this.authenticationManager = authenticationManager; 
     this.appConfig = appConfig; 
    } 

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

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

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     endpoints.authenticationManager(authenticationManager); 
    } 
} 

的AppConfig類

@Configuration 
@PropertySource(value = "classpath:application.properties") 
public class AppConfig { 

    @Value("${spring.datasource.url}") 
    private String datasourceUrl; 

    @Value("${spring.database.driverClassName}") 
    private String dbDriverClassName; 

    @Value("${spring.datasource.username}") 
    private String dbUsername; 

    @Value("${spring.datasource.password}") 
    private String dbPassword; 

    @Bean 
    public DataSource dataSource() { 
     final DriverManagerDataSource dataSource = new DriverManagerDataSource(); 

     dataSource.setDriverClassName(dbDriverClassName); 
     dataSource.setUrl(datasourceUrl); 
     dataSource.setUsername(dbUsername); 
     dataSource.setPassword(dbPassword); 

     return dataSource; 
    } 

    @Bean 
    public TokenStore tokenStore() { 
     return new JdbcTokenStore(dataSource()); 
    } 
} 

這裏是我的情況下的pom.xml它的任何幫助,找到爲什麼沒有堅持令牌在數據庫中。

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.6.RELEASE</version> 
    <relativePath/> 
    <!-- lookup parent from repository --> 
</parent> 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    <java.version>1.8</java.version> 
    <!-- Defining which version of Spring Framework we are using --> 
    <spring-cloud.version>Dalston.SR1</spring-cloud.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-actuator</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.cloud</groupId> 
     <artifactId>spring-cloud-starter-oauth2</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.cloud</groupId> 
     <artifactId>spring-cloud-aws-context</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger2</artifactId> 
     <version>2.6.1</version> 
    </dependency> 
    <dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger-ui</artifactId> 
     <version>2.4.0</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.validation</groupId> 
     <artifactId>validation-api</artifactId> 
    </dependency> 
</dependencies> 

我的問題是,爲什麼生成的標記沒有被保存到MySQL數據庫,我該如何解決它?

+0

(1)是否有你宣佈你自己的'DataSource'豆一個特別的原因? (2)不要指定'application.properties' - 這是默認的,如果你想覆蓋它,那就在啓動時執行。 (3)你確定你的AppConfig正在被加載嗎? (在你的'tokenStore'方法中放置一個斷點。) – chrylis

+0

(1)我正在學習一個教程,他們創建了自己的'DataSource',所以我嘗試引導應用程序。 (2)如果我沒有指定它,那麼'AppConfig'出於某種未知的原因未被加載。 (3)是的,它被加載。 'tokenStore'上的斷點被加載/命中 - 指定'application.properties',否則斷點不加載/命中 – dazito

回答

1

春季安全的OAuth 2使用的內存中執行默認令牌存儲裝置的,見OAuth 2 Developers Guide

在創建AuthorizationServerTokenServices實現,你可能要考慮使用其中有許多戰略DefaultTokenServices可以插入它來更改訪問令牌的格式和存儲。默認情況下,它通過隨機值創建令牌,並處理除代理向TokenStore委派的令牌的持久性以外的所有內容。默認存儲是內存中的實現,但還有一些其他實現可用。下面是與他們每個人

  • 的一些討論描述默認InMemoryTokenStore是一臺服務器完全正常的(即低流量,並沒有熱插拔到備份服務器發生故障的情況下)。大多數項目可以從這裏開始,也許可以在開發模式下以這種方式進行操作,以便輕鬆啓動不依賴項的服務器。

您可以更改使用的實現令牌存儲與AuthorizationServerEndpointsConfigurer#tokenStore

修改後的授權服務器端點配置:

@Override 
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
    endpoints 
     .authenticationManager(authenticationManager) 
     .tokenStore(appConfig.tokenStore()); 
}