我正在使用Spring Boot和Spring Security OAuth以及JDBC客户端支持在我的应用程序上实现OAuth2。
我可以生成令牌,当我向http://localhost:8080/oauth/token发出POST请求时,我得到了一个有效的回复:
{
"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)
Spring Security 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());
}
答案 1 :(得分:0)
默认情况下,配置内存令牌存储。如果要在重新启动之间保留令牌,则需要配置持久性令牌存储。
请查看以下工作示例。 :https://github.com/spring-projects/spring-security-oauth/tree/master/tests/annotation/jdbc