refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token
原標題:「SpringCloud」 Spring Security OAuth2 Mysql管理在線Token
前言:Spring Cloud 分布式中的登錄如何可視化的管理目前下發(fā)的令牌、使用情況、授權情況,本篇主要介紹Mysql存儲令牌的方式
一、Spring Security OAuth2 Token存儲方式
InMemory適用場景,單機;無大的訪問量;可以承受重啟丟失問題;
JDBC適用場景,分布式;無超大訪問量;永久存儲;
Redis適用場景:分布式;大訪問或小訪問都適合;緩存機器不崩潰token一般不丟失;
二、數(shù)據(jù)表結構
# 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 '登錄用戶名',
`client_id` varchar(256) DEFAULT NULL COMMENT '客戶端',
`authentication` blob COMMENT 'OAuth2Authentication.java對象序列化后的二進制',
`refresh_token` varchar(256) DEFAULT NULL COMMENT 'refresh_token的值通過MD5',
PRIMARY KEY (`authentication_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='在線用戶的Token';
# Dump of table oauth_approvals
# ------------------------------------------------------------
DROP TABLE IF EXISTS `oauth_approvals`;
CREATE TABLE `oauth_approvals` (
`userId` varchar(256) DEFAULT NULL COMMENT '用戶ID',
`clientId` varchar(256) DEFAULT NULL COMMENT '客戶端',
`scope` varchar(256) DEFAULT NULL COMMENT '權限',
`status` varchar(10) DEFAULT NULL COMMENT '狀態(tài)',
`expiresAt` datetime DEFAULT NULL COMMENT '過期時間',
`lastModifiedAt` datetime DEFAULT NULL COMMENT '最后修改時間'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='認證權限狀態(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 '客戶端ID',
`resource_ids` varchar(256) DEFAULT NULL COMMENT '資源標識',
`client_secret_raw` varchar(255) DEFAULT NULL COMMENT '客戶端密鑰原數(shù)據(jù)',
`client_secret` varchar(256) DEFAULT NULL COMMENT '客戶端密鑰',
`scope` varchar(256) DEFAULT NULL COMMENT '作用域:read,write',
`authorized_grant_types` varchar(256) DEFAULT NULL COMMENT '授權類型',
`web_server_redirect_uri` varchar(256) DEFAULT NULL COMMENT '回調(diào)地址',
`authorities` varchar(256) DEFAULT NULL COMMENT '權限值',
`access_token_validity` int(11) DEFAULT NULL COMMENT 'access_token的有效時間值,默認24小時',
`refresh_token_validity` int(11) DEFAULT NULL COMMENT 'refresh_token的有效時間值',
`additional_information` varchar(4096) DEFAULT NULL COMMENT '客戶端的一些其他信息',
`autoapprove` varchar(256) DEFAULT NULL COMMENT '用戶是否自動Approval默認值為 ''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='認證客戶端';
# 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 '服務端的accesstoken',
`token` blob COMMENT 'accesstoken 對象序列化后的二進制',
`authentication_id` varchar(128) NOT NULL COMMENT '唯一ID',
`user_name` varchar(256) DEFAULT NULL COMMENT '登錄用戶名',
`client_id` varchar(256) DEFAULT NULL COMMENT '客戶端',
PRIMARY KEY (`authentication_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='客戶端 Token';
# Dump of table oauth_code
# ------------------------------------------------------------
DROP TABLE IF EXISTS `oauth_code`;
CREATE TABLE `oauth_code` (
`code` varchar(256) DEFAULT NULL COMMENT ' 存儲服務端系統(tǒng)生成的code的值(未加密)',
`authentication` blob COMMENT 'AuthorizationRequestHolder對象序列化后的二進制數(shù)據(jù)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='授權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 '自增編號',
`resource_id` varchar(100) NOT NULL DEFAULT '' COMMENT '資源名稱',
`create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時間',
`update_time` datetime DEFAULT NULL COMMENT '更新時間',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uniq_resource_id` (`resource_id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='授權資源';
三、關注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 (
// 因存儲到mysql使用提bold jdk序列化的結果,所以需要進行反序列化
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("訪問令牌:",accessToken.getValue())
log.info("過期時間:",accessToken.getExpiration());
//用戶信息 與訪問令牌解析同理,都是因SpringSecurity在存儲的時候采用了jdk序列化的值直接入庫,所以我們需要進行反解析
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)過期或者錯誤
if (authentication != null) {
OAuth2Request request = authentication.getOAuth2Request();
// 當前使用的用戶名
log.info("當前使用的用戶名:",authentication.getName());
// 當前授權使用的客戶端
log.info("當前授權使用的客戶端:",request.getClientId());
// 當前令牌的授權方式
log.info("當前令牌的授權方式:",request.getGrantType());
}
}
}
四、最后
本篇并未介紹怎么去封裝TokenStore,后續(xù)會慢慢的增加這個相關的封裝,主要是為了管理者方便查看目前在線的token及使用登錄的情況。
本次討論一下為什么Spring Security OAuth在設計的時候要直接把序列化的數(shù)據(jù)放進去,而不是使用一種可讀性更好的方案?返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python filename 以txt
- 下一篇: 09945 oracle 解决方法_OR