日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token

發(fā)布時(shí)間:2025/3/19 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。