oauth2.0mysql表设计_OAuth2.0系列之信息数据库存储实践
(六)
@
1、OAuth2.0信息存储⽅式
在前⾯⽂章中我们学习了OAuth2的⼀些基本概念,对OAuth2有了基本的认识,也对OAuth2.0的⼏种授权模式进⾏了实践,⽐如授权码模式
在前⾯的学习中,我们配置客户端信息,⼀般会如下配置,如果有多个客户端的话,就复制⼀遍,修改⼀些参数,很显然,这种在⽣产环境是不适应的,所以Spring Security OAuth2是有提供⼏种存储⽅式的,默认是基于内存存储
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
/
/ 使⽤内存存储
.inMemory()美菱净水器
//标记客户端id
.withClient(CLIENT_ID)
//客户端安全码
.cret(SECRET_CHAR_SEQUENCE)
//为true 直接⾃动授权成功返回code
.autoApprove(true)
.redirectUris("127.0.0.1:8084/cms/login") //重定向uri
//允许授权范围
.scopes(ALL)
/
/token 时间秒
.accessTokenValiditySeconds(ACCESS_TOKEN_VALIDITY_SECONDS)
//刷新token 时间 秒
.refreshTokenValiditySeconds(FREFRESH_TOKEN_VALIDITY_SECONDS)
//允许授权类型
.authorizedGrantTypes(GRANT_TYPE_PASSWORD , AUTHORIZATION_CODE , REFRESH_TOKEN , IMPLICIT);
}
对于token存储⼀遍使⽤内存存储
雄激素高@Bean
public TokenStore memoryTokenStore() {
// 最基本的InMemoryTokenStore⽣成token
return new InMemoryTokenStore();
}
IDEA中,Ctrl+Alt+B,可以看到TokenStore的实现,有如下⼏种:
ok,其实对于token存储有如上⽅式,对于其它⽐如授权码code等的存储也基本如上⼏种,分别进⾏介绍:
InMemoryTokenStore,默认存储,保存在内存
JdbcTokenStore,access_token存储在数据库
JwtTokenStore,JWT这种⽅式⽐较特殊,这是⼀种⽆状态⽅式的存储,不进⾏内存、数据库存储,只是JWT中携带全⾯的⽤户信息,保存在jwt中携带过去校验就可以
RedisTokenStore,将 access_token 存到 redis 中。
JwkTokenStore,将 access_token 保存到 JSON Web Key。
2、数据表schema脚本
ok,有了前⾯的了解之后,现在要实现客户端配置信息,access_token等等信息的数据库存储要怎么实现?
要数据库存储,肯定要先建表,当然不⽤⾃⼰设计,去官⽅github拿就可以。schema脚本:官⽅Spring-curity-oauth2提供的所有脚本:链接,官⽅脚本是HSQL数据库,所以我们改成mysql版,其中oauth_client_details ⽤于存储客户端配置信息,oauth_code存储授权码,oauth_access_token存储access_token
-- ud in tests that u MYSQL
银行理财哪个银行收益最高
美满CREATE TABLE oauth_client_details (
client_id VARCHAR(128) PRIMARY KEY,
resource_ids VARCHAR(128),
client_cret VARCHAR(128),
scope VARCHAR(128),
authorized_grant_types VARCHAR(128),
web_rver_redirect_uri VARCHAR(128),
authorities VARCHAR(128),
access_token_validity INTEGER,
refresh_token_validity INTEGER,
additional_information VARCHAR(4096), autoapprove VARCHAR(128)
);
CREATE TABLE oauth_client_token (
token_id VARCHAR(128),
token BLOB,
authentication_id VARCHAR(128) PRIMARY KEY, ur_name VARCHAR(128),
client_id VARCHAR(128)
);
CREATE TABLE oauth_access_token (
token_id VARCHAR(128),
token BLOB,
关于读书作文
authentication_id VARCHAR(128) PRIMARY KEY, ur_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 (
urId VARCHAR(128),
clientId VARCHAR(128),
scope VARCHAR(128),
STATUS VARCHAR(10),
expiresAt TIMESTAMP,
lastModifiedAt TIMESTAMP DEFAULT CURRENT_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)
);
要进⾏登录验证,也可以设计⼀张⽤户数据业务表:
# ⽤户表
CREATE TABLE USER (
考研学校怎么选id INT(11) NOT NULL AUTO_INCREMENT,
毛密密b
email VARCHAR(255),
PASSWORD VARCHAR(255) NOT NULL,
phone VARCHAR(255),
urname VARCHAR(255) NOT NULL UNIQUE,
last_login_time DATETIME ,
PRIMARY KEY (id)
)
INSERT INTO USER (email,PASSWORD,phone,urname,last_login_time) VALUES ('','11','155********','admin',SYSDATE());
3、SpringBoot环境搭建
IntelliJ IDEA
Maven3.+版本
新建SpringBoot Initializer项⽬,可以命名oauth2-jdbc-store
主要加⼊如下配置:
org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-oauth2 org.springframework.cloud spring-cloud-starter-curity