抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

OAuth2持久化配置

OAuth2 配置持久化

创建表

根据官方Spring-security-oauth2提供的创建表的schema的SQL语句,我们首先创建相关表。

​ 注意:官方提供的SQL是HSQL的,使用MySQL需要更改一些字段,把LONGVARBINARY类型改为BLOB类型,同时把主键长度256改为128。在新版本的MySQL可以不用更改,能够支持256的长度。下面是我更改好的,可直接使用。同时我部分表添加enable字段,作为开关标志位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

-- used in tests that use HSQL
create table oauth_client_details (
client_id VARCHAR(128) PRIMARY KEY,
resource_ids VARCHAR(128),
client_secret VARCHAR(128),
scope VARCHAR(128),
authorized_grant_types VARCHAR(128),
web_server_redirect_uri VARCHAR(128),
authorities VARCHAR(128),
access_token_validity INTEGER,
refresh_token_validity INTEGER,
additional_information VARCHAR(4096),
enable tinyint(1) default '1',
autoapprove VARCHAR(128)
);

create table oauth_client_token (
token_id VARCHAR(128),
token BLOB,
authentication_id VARCHAR(128) PRIMARY KEY,
user_name VARCHAR(128),
client_id VARCHAR(128)
);

create table oauth_access_token (
token_id VARCHAR(128),
token BLOB,
authentication_id VARCHAR(128) PRIMARY KEY,
user_name VARCHAR(128),
client_id VARCHAR(128),
authentication BLOB,
refresh_token VARCHAR(128)
);


create table oauth_refresh_token (
token_id VARCHAR(128),
token BLOB,
authentication BLOB
);


create table oauth_code (
code VARCHAR(128), authentication BLOB
);

create table oauth_approvals (
userId VARCHAR(128),
clientId VARCHAR(128),
scope VARCHAR(128),
status VARCHAR(10),
expiresAt TIMESTAMP,
lastModifiedAt TIMESTAMP
);

-- customized oauth_client_details table
create table ClientDetails (
appId VARCHAR(128) PRIMARY KEY,
resourceIds VARCHAR(128),
appSecret VARCHAR(128),
scope VARCHAR(128),
grantTypes VARCHAR(128),
redirectUrl VARCHAR(128),
authorities VARCHAR(128),
access_token_validity INTEGER,
refresh_token_validity INTEGER,
additionalInformation VARCHAR(4096),
autoApproveScopes VARCHAR(128)
);

创建好的表如上图所示。

最后生成了这七张表,关于具体字段详情的含义介绍可以查看相关文档。

添加POM依赖

接着我们添加数据库依赖如下:

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
配置文件修改

添加数据库配置文件

1
2
3
4
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.64.128:3306/oauth?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
配置类修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/**
* 授权服务器配置
**/
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {


@Autowired
private AuthenticationManager authenticationManager;

@Autowired
UserDetailsService userDetailsService;


@Autowired
private DataSource dataSource;


@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

//默认值InMemoryTokenStore对于单个服务器是完全正常的(即,在发生故障的情况下,低流量和热备份备份服务器)。大多数项目可以从这里开始,也可以在开发模式下运行,以便轻松启动没有依赖关系的服务器。
//这JdbcTokenStore是同一件事的JDBC版本,它将令牌数据存储在关系数据库中。如果您可以在服务器之间共享数据库,则可以使用JDBC版本,如果只有一个,则扩展同一服务器的实例,或者如果有多个组件,则授权和资源服务器。要使用JdbcTokenStore你需要“spring-jdbc”的类路径。

//这个地方指的是从jdbc查出数据来存储
clients.withClientDetails(clientDetails());


}

@Bean
public ClientDetailsService clientDetails() {
return new JdbcClientDetailsService(dataSource);
}


/**
* 用来配置令牌端点(Token Endpoint)的安全约束.
*
* @param security
* @throws Exception
*/
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
/* 配置token获取合验证时的策略 允许表单认证 */

security.allowFormAuthenticationForClients().
//客户端token调用许可
tokenKeyAccess("permitAll()").
//客户端校验token访问许可
checkTokenAccess("isAuthenticated()");
}

/**
* 用来配置授权(authorization)以及令牌(token)的访问端点和令牌服务(token services)
*
* @param endpoints
* @throws Exception
*/
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
// 配置tokenStore,需要配置userDetailsService,否则refresh_token会报错
endpoints.authenticationManager(authenticationManager).
//配置用户服务
userDetailsService(userDetailsService).
allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST).
//指定token存储位置
tokenStore(tokenStore()).
// 配置用于JWT私钥加密的增强器
tokenEnhancer(jwtTokenEnhancer());
}

@Bean
protected JwtAccessTokenConverter jwtTokenEnhancer() {
// 配置jks文件
KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("order-jwt.jks"), "123456".toCharArray());
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setKeyPair(keyStoreKeyFactory.getKeyPair("order-jwt"));
return converter;
}

@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(jwtTokenEnhancer());
}

}
测试

通过jwt客户端模式测试

测试通过,oauth2读取数据库配置完成

评论