2017-07-30 102 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()); 
}