refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token
原標(biāo)題:「SpringCloud」 Spring Security OAuth2 Mysql管理在線Token
前言:Spring Cloud 分布式中的登錄如何可視化的管理目前下發(fā)的令牌、使用情況、授權(quán)情況,本篇主要介紹Mysql存儲(chǔ)令牌的方式
一、Spring Security OAuth2 Token存儲(chǔ)方式
InMemory適用場(chǎng)景,單機(jī);無(wú)大的訪問(wèn)量;可以承受重啟丟失問(wèn)題;
JDBC適用場(chǎng)景,分布式;無(wú)超大訪問(wèn)量;永久存儲(chǔ);
Redis適用場(chǎng)景:分布式;大訪問(wèn)或小訪問(wèn)都適合;緩存機(jī)器不崩潰token一般不丟失;
二、數(shù)據(jù)表結(jié)構(gòu)
# Dump of table oauth_access_token
# ------------------------------------------------------------
DROP TABLE IF EXISTS `oauth_access_token`;
CREATE TABLE `oauth_access_token` (
`token_id` varchar(256) DEFAULT NULL COMMENT 'token值 md5加密',
`token` blob COMMENT '序列化的accesstoken值 ',
`authentication_id` varchar(128) NOT NULL COMMENT '參考DefaultAuthenticationKeyGenerator',
`user_name` varchar(256) DEFAULT NULL COMMENT '登錄用戶(hù)名',
`client_id` varchar(256) DEFAULT NULL COMMENT '客戶(hù)端',
`authentication` blob COMMENT 'OAuth2Authentication.java對(duì)象序列化后的二進(jìn)制',
`refresh_token` varchar(256) DEFAULT NULL COMMENT 'refresh_token的值通過(guò)MD5',
PRIMARY KEY (`authentication_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='在線用戶(hù)的Token';
# Dump of table oauth_approvals
# ------------------------------------------------------------
DROP TABLE IF EXISTS `oauth_approvals`;
CREATE TABLE `oauth_approvals` (
`userId` varchar(256) DEFAULT NULL COMMENT '用戶(hù)ID',
`clientId` varchar(256) DEFAULT NULL COMMENT '客戶(hù)端',
`scope` varchar(256) DEFAULT NULL COMMENT '權(quán)限',
`status` varchar(10) DEFAULT NULL COMMENT '狀態(tài)',
`expiresAt` datetime DEFAULT NULL COMMENT '過(guò)期時(shí)間',
`lastModifiedAt` datetime DEFAULT NULL COMMENT '最后修改時(shí)間'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='認(rèn)證權(quán)限狀態(tài)';
# Dump of table oauth_client_details
# ------------------------------------------------------------
DROP TABLE IF EXISTS `oauth_client_details`;
CREATE TABLE `oauth_client_details` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`client_id` varchar(128) NOT NULL COMMENT '客戶(hù)端ID',
`resource_ids` varchar(256) DEFAULT NULL COMMENT '資源標(biāo)識(shí)',
`client_secret_raw` varchar(255) DEFAULT NULL COMMENT '客戶(hù)端密鑰原數(shù)據(jù)',
`client_secret` varchar(256) DEFAULT NULL COMMENT '客戶(hù)端密鑰',
`scope` varchar(256) DEFAULT NULL COMMENT '作用域:read,write',
`authorized_grant_types` varchar(256) DEFAULT NULL COMMENT '授權(quán)類(lèi)型',
`web_server_redirect_uri` varchar(256) DEFAULT NULL COMMENT '回調(diào)地址',
`authorities` varchar(256) DEFAULT NULL COMMENT '權(quán)限值',
`access_token_validity` int(11) DEFAULT NULL COMMENT 'access_token的有效時(shí)間值,默認(rèn)24小時(shí)',
`refresh_token_validity` int(11) DEFAULT NULL COMMENT 'refresh_token的有效時(shí)間值',
`additional_information` varchar(4096) DEFAULT NULL COMMENT '客戶(hù)端的一些其他信息',
`autoapprove` varchar(256) DEFAULT NULL COMMENT '用戶(hù)是否自動(dòng)Approval默認(rèn)值為 ''false'', 可選值包括 ''true'',''false'', ''read'',''write''.',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uniq_client_id` (`client_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='認(rèn)證客戶(hù)端';
# Dump of table oauth_client_token
# ------------------------------------------------------------
DROP TABLE IF EXISTS `oauth_client_token`;
CREATE TABLE `oauth_client_token` (
`token_id` varchar(256) DEFAULT NULL COMMENT '服務(wù)端的accesstoken',
`token` blob COMMENT 'accesstoken 對(duì)象序列化后的二進(jìn)制',
`authentication_id` varchar(128) NOT NULL COMMENT '唯一ID',
`user_name` varchar(256) DEFAULT NULL COMMENT '登錄用戶(hù)名',
`client_id` varchar(256) DEFAULT NULL COMMENT '客戶(hù)端',
PRIMARY KEY (`authentication_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='客戶(hù)端 Token';
# Dump of table oauth_code
# ------------------------------------------------------------
DROP TABLE IF EXISTS `oauth_code`;
CREATE TABLE `oauth_code` (
`code` varchar(256) DEFAULT NULL COMMENT ' 存儲(chǔ)服務(wù)端系統(tǒng)生成的code的值(未加密)',
`authentication` blob COMMENT 'AuthorizationRequestHolder對(duì)象序列化后的二進(jìn)制數(shù)據(jù)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='授權(quán)code';
# Dump of table oauth_refresh_token
# ------------------------------------------------------------
DROP TABLE IF EXISTS `oauth_refresh_token`;
CREATE TABLE `oauth_refresh_token` (
`token_id` varchar(256) DEFAULT NULL COMMENT 'token值',
`token` blob COMMENT '序列化',
`authentication` blob COMMENT '序列化'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='刷新Token';
# Dump of table oauth_resources
# ------------------------------------------------------------
DROP TABLE IF EXISTS `oauth_resources`;
CREATE TABLE `oauth_resources` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增編號(hào)',
`resource_id` varchar(100) NOT NULL DEFAULT '' COMMENT '資源名稱(chēng)',
`create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
`update_time` datetime DEFAULT NULL COMMENT '更新時(shí)間',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uniq_resource_id` (`resource_id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='授權(quán)資源';
三、關(guān)注AccessToken表
1、讀取及定義模型
public class OauthAccessToken extends Model {
private String tokenId;
private Object token;
private String authenticationId;
private String userName;
private String clientId;
private Object authentication;
private String refreshToken;
}
2、讀取
public List all(){
List list = baseMapper.selectList(null);
return list;
}
3、解析+解釋
public void parseAccessToken(){
List list = this.all();
for (OauthAccessToken tokenObject : list
) {
DefaultOAuth2AccessToken accessToken = null;
try (
// 因存儲(chǔ)到mysql使用提bold jdk序列化的結(jié)果,所以需要進(jìn)行反序列化
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream((byte[]) tokenObject.getToken());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
) {
Object o = objectInputStream.readObject();
accessToken = (DefaultOAuth2AccessToken) o;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
log.info("訪問(wèn)令牌:",accessToken.getValue())
log.info("過(guò)期時(shí)間:",accessToken.getExpiration());
//用戶(hù)信息 與訪問(wèn)令牌解析同理,都是因SpringSecurity在存儲(chǔ)的時(shí)候采用了jdk序列化的值直接入庫(kù),所以我們需要進(jìn)行反解析
OAuth2Authentication authentication = null;
try (
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream((byte[]) tokenObject.getAuthentication());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
) {
Object o = objectInputStream.readObject();
authentication = (OAuth2Authentication) o;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
// 如果不存在,證明已經(jīng)過(guò)期或者錯(cuò)誤
if (authentication != null) {
OAuth2Request request = authentication.getOAuth2Request();
// 當(dāng)前使用的用戶(hù)名
log.info("當(dāng)前使用的用戶(hù)名:",authentication.getName());
// 當(dāng)前授權(quán)使用的客戶(hù)端
log.info("當(dāng)前授權(quán)使用的客戶(hù)端:",request.getClientId());
// 當(dāng)前令牌的授權(quán)方式
log.info("當(dāng)前令牌的授權(quán)方式:",request.getGrantType());
}
}
}
四、最后
本篇并未介紹怎么去封裝TokenStore,后續(xù)會(huì)慢慢的增加這個(gè)相關(guān)的封裝,主要是為了管理者方便查看目前在線的token及使用登錄的情況。
本次討論一下為什么Spring Security OAuth在設(shè)計(jì)的時(shí)候要直接把序列化的數(shù)據(jù)放進(jìn)去,而不是使用一種可讀性更好的方案?返回搜狐,查看更多
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python filename 以txt
- 下一篇: mysql十分钟分组_MYSQL每隔10