成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于spring-security-oauth2實現(xiàn)oauth2數(shù)據(jù)庫版(持續(xù)更新)

DangoSky / 3559人閱讀

摘要:基于實現(xiàn)數(shù)據(jù)庫版文章代碼地址鏈接描述可以下載直接運行,基于,版本實現(xiàn)該系列分為兩個部分分為內(nèi)存實現(xiàn),數(shù)據(jù)庫實現(xiàn)。其中數(shù)據(jù)庫實現(xiàn)采用權(quán)限角色管理。創(chuàng)建的時候,需要使用數(shù)據(jù)源,從數(shù)據(jù)庫查詢?;跀?shù)據(jù)庫的認證服務(wù)完成。

基于spring-security-oauth2實現(xiàn)oauth2數(shù)據(jù)庫版

文章代碼地址:鏈接描述可以下載直接運行,基于springboot2.1.5,springcloud Greenwich版本實現(xiàn)

該系列分為兩個部分:分為內(nèi)存實現(xiàn),數(shù)據(jù)庫實現(xiàn)。其中數(shù)據(jù)庫實現(xiàn)采用RBAC權(quán)限角色管理。

上一篇,介紹了oauth2的內(nèi)存實現(xiàn),也就是認證服務(wù)把客戶端和用戶信息都存儲在內(nèi)存中,這樣不利于拓展,不適合于生產(chǎn)環(huán)境。下面,我們開始基于mysql數(shù)據(jù)庫的oauth2實現(xiàn)。
首先,我們創(chuàng)建oauth2數(shù)據(jù)庫,注意編碼選擇utf-8mb4格式,utf-8是不規(guī)范的,mysql也沒有進行更改。

好了,現(xiàn)在我們初始化表,sql如下:

Drop table if exists oauth_client_details;
create table oauth_client_details (
client_id VARCHAR(255) PRIMARY KEY,
resource_ids VARCHAR(255),
client_secret VARCHAR(255),
scope VARCHAR(255),
authorized_grant_types VARCHAR(255),
web_server_redirect_uri VARCHAR(255),
authorities VARCHAR(255),
access_token_validity INTEGER,
refresh_token_validity INTEGER,
additional_information TEXT,
autoapprove VARCHAR (255) default "false"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Drop table if exists oauth_access_token;
create table oauth_access_token (
token_id VARCHAR(255),
token BLOB,
authentication_id VARCHAR(255),
user_name VARCHAR(255),
client_id VARCHAR(255),
authentication BLOB,
refresh_token VARCHAR(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Drop table if exists oauth_refresh_token;
create table oauth_refresh_token (
token_id VARCHAR(255),
token BLOB,
authentication BLOB
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Drop table if exists oauth_code;
create table oauth_code (
code VARCHAR(255),
authentication BLOB
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Add indexes
create index token_id_index on oauth_access_token (token_id);
create index authentication_id_index on oauth_access_token (authentication_id);
create index user_name_index on oauth_access_token (user_name);
create index client_id_index on oauth_access_token (client_id);
create index refresh_token_index on oauth_access_token (refresh_token);
create index token_id_index on oauth_refresh_token (token_id);
create index code_index on oauth_code (code);

-- INSERT DEFAULT DATA
INSERT INTO oauth_client_details VALUES ("dev", "", "dev", "app", "authorization_code", "http://localhost:7777/", "", "3600", "3600", "{"country":"CN","country_code":"086"}", "TAIJI");

-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS tb_user;
CREATE TABLE tb_user (

                       `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT "主鍵ID",
                       `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "用戶名",
                       `password` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "密碼",
                       `gender` int(2) DEFAULT NULL COMMENT "性別(1男 2女)",
                       `email` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "郵箱",
                       `create_time` datetime DEFAULT NULL COMMENT "用戶創(chuàng)建時間",
                       `update_time` datetime DEFAULT NULL COMMENT "更新時間",
                       `removed` int(2) DEFAULT NULL COMMENT "是否刪除(1刪除0未刪除)",
                       PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
BEGIN;
INSERT INTO tb_user VALUES (1, "admin", "$2a$10$vWyL7fMGQRvVNn.i2bK40e3z30Nem4k.ElwuxdLBNzKFxRCcXCoqm", 1, NULL, "2019-05-30 15:53:45", "2019-05-30 15:53:51", 0);
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

-- ----------------------------
-- Table structure for tb_user_role
-- ----------------------------
DROP TABLE IF EXISTS tb_user_role;
CREATE TABLE tb_user_role (

                            `id` bigint(11) NOT NULL COMMENT "主鍵ID",
                            `user_id` bigint(11) DEFAULT NULL COMMENT "用戶主鍵",
                            `role_id` bigint(11) DEFAULT NULL COMMENT "角色ID",
                            PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- ----------------------------
-- Records of tb_user_role
-- ----------------------------
BEGIN;
INSERT INTO tb_user_role VALUES (1, 1, 1);
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

-- ----------------------------
-- Table structure for tb_role
-- ----------------------------
DROP TABLE IF EXISTS tb_role;
CREATE TABLE tb_role (

                       `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT "主鍵ID",
                       `parent_id` bigint(20) DEFAULT NULL COMMENT "父類ID",
                       `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "角色名字",
                       `ename` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "角色名字",
                       `description` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "描述",
                       `create_time` datetime DEFAULT NULL COMMENT "創(chuàng)建時間",
                       `update_time` datetime DEFAULT NULL COMMENT "更新時間",
                       PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- ----------------------------
-- Records of tb_role
-- ----------------------------
BEGIN;
INSERT INTO tb_role VALUES (1, 0, "超級管理員", "ADMIN", NULL, "2019-05-30 16:09:53", "2019-05-30 16:09:57");
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

-- ----------------------------
-- Table structure for tb_role_permission
-- ----------------------------
DROP TABLE IF EXISTS tb_role_permission;
CREATE TABLE tb_role_permission (

                                  `id` bigint(11) NOT NULL COMMENT "主鍵ID",
                                  `role_id` bigint(11) DEFAULT NULL COMMENT "角色ID",
                                  `permission_id` bigint(11) DEFAULT NULL COMMENT "權(quán)限ID",
                                  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- ----------------------------
-- Records of tb_role_permission
-- ----------------------------
BEGIN;
INSERT INTO tb_role_permission VALUES (1, 1, 1);
INSERT INTO tb_role_permission VALUES (2, 1, 2);
INSERT INTO tb_role_permission VALUES (3, 1, 3);
INSERT INTO tb_role_permission VALUES (4, 1, 4);
INSERT INTO tb_role_permission VALUES (5, 1, 5);
INSERT INTO tb_role_permission VALUES (6, 1, 6);
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

-- ----------------------------
-- Table structure for tb_permission
-- ----------------------------
DROP TABLE IF EXISTS tb_permission;
CREATE TABLE tb_permission (

                             `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT "主鍵ID",
                             `parent_id` bigint(11) DEFAULT NULL COMMENT "用戶ID",
                             `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "權(quán)限名字",
                             `ename` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "權(quán)限名字",
                             `url` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "請求路徑",
                             `description` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT "描述",
                             `create_time` datetime DEFAULT NULL COMMENT "創(chuàng)建時間",
                             `update_time` datetime DEFAULT NULL COMMENT "更新時間",
                             PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- ----------------------------
-- Records of tb_permission
-- ----------------------------
BEGIN;
INSERT INTO tb_permission VALUES (1, 0, "系統(tǒng)管理", "System", "/", NULL, "2019-05-30 16:22:20", "2019-05-30 16:22:24");
INSERT INTO tb_permission VALUES (2, 0, "用戶管理", "SystemUser", "/users", NULL, "2019-05-30 16:23:28", "2019-05-30 16:23:32");
INSERT INTO tb_permission VALUES (3, 0, "查看用戶", "SystemUserView", NULL, NULL, "2019-05-30 16:24:29", "2019-05-30 16:24:33");
INSERT INTO tb_permission VALUES (4, 0, "新增用戶", "SystemUserInsert", NULL, NULL, "2019-05-30 16:25:09", "2019-05-30 16:25:13");
INSERT INTO tb_permission VALUES (5, 0, "編輯用戶", "SystemUserUpdate", NULL, NULL, "2019-05-30 16:25:53", "2019-05-30 16:25:57");
INSERT INTO tb_permission VALUES (6, 0, "刪除用戶", "SystemUserDelete", NULL, NULL, "2019-05-30 16:26:49", "2019-05-30 16:26:54");
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

我們看看表結(jié)構(gòu):


簡單介紹,這是把客戶端配置從內(nèi)存中轉(zhuǎn)移到oauth_client_details表中,字段意思請參考上一篇鏈接描述

oauth_access_token: access_token 表結(jié)構(gòu):


oauth_code表結(jié)構(gòu):


oauth_refresh_token表結(jié)構(gòu):


下面是用戶信息表:
tb_user表:


tb_user_role表結(jié)構(gòu):


tb_role表結(jié)構(gòu):


tb_role_permission表結(jié)構(gòu):


tb_permission表結(jié)構(gòu):

好了,表設(shè)計完成。下面我們開始編碼:

(1)我們把之前的項目復(fù)制一份修改名字,添加依賴:


我們添加數(shù)據(jù)庫的依賴,使用mybatis作為持久層框架。

(2)下面是項目結(jié)構(gòu):

這里介紹intellij的mybatis自動生成插件easycode,只要配置好數(shù)據(jù)庫連接,可以自動生成domain,mapper,xml等文件。
首先,修改WebSecurityConfig文件如下:


這里將內(nèi)存換到數(shù)據(jù)庫,使用userDetailsService,因為,我們需要注入UserDetailsService,創(chuàng)建UserDetailsServiceImpl文件


這里實現(xiàn)UserDetailsService接口,實現(xiàn)loadUserByUsername方法,這個方法根據(jù)用戶名查詢用戶信息,查詢用戶權(quán)限,返回認證用戶import org.springframework.security.core.userdetails.User; userdetails包下的User對象。
這里重點介紹一下查詢權(quán)限的sql:


通過連表用戶,角色,權(quán)限等連表查詢權(quán)限。

(3)用戶驗證完成,開始認證處理,修改AuthConfig如下:


這里我們將客戶端client放到數(shù)據(jù)庫,使用JdbcClientDetailsService。創(chuàng)建service的時候,需要使用DataSource數(shù)據(jù)源,從數(shù)據(jù)庫查詢。使用jdbcTokenStore存儲token。
(4)創(chuàng)建OauthPasswordConfig配置注入BCrytpPasswordEncoder對象:


(5)實體類如下:


(6)應(yīng)用配置文件:


(7)完成,現(xiàn)在我們使用9001端口啟動應(yīng)用:


(8)啟動成功,我們訪問地址:
http://localhost:9001/oauth/oauthorize?client_id=client&response_type=code/
如下:


輸入賬戶:admin 密碼: 123456 點擊登錄:


同意授權(quán)


跳轉(zhuǎn)成功,我們使用code,訪問這個地址,獲取token
http://client:secret@http://localhost:9001/oauth/token


得到結(jié)果:


成功,得到access_token。
基于數(shù)據(jù)庫的認證服務(wù)完成。未完待續(xù),下一篇介紹單點登錄
有問題,請留言。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74728.html

相關(guān)文章

  • 基于spring-security-oauth2實現(xiàn)資源服務(wù)器和認證服務(wù)器對接(持續(xù)更新

    摘要:基于實現(xiàn)資源服務(wù)器文章代碼地址鏈接描述可以下載直接運行,基于,版本實現(xiàn)。資源服務(wù)器顧名思義就是提供資源的服務(wù)器。和認證服務(wù)器對接后,將受到資源的保護?;诘馁Y源服務(wù)器實現(xiàn)完成,未完待續(xù),下一篇將實現(xiàn)單點登錄和網(wǎng)關(guān)的對接。 基于spring-security-oauth2實現(xiàn)資源服務(wù)器 文章代碼地址:鏈接描述可以下載直接運行,基于springboot2.1.5,springcloud ...

    Imfan 評論0 收藏0
  • 基于spring-security-oauth2實現(xiàn)單點登錄(持續(xù)更新

    摘要:認證服務(wù)器和瀏覽器控制臺也沒有報錯信息。這里簡單介紹下如何查閱源碼,首先全局搜索自己的配置因為這個地址是認證服務(wù)器請求授權(quán)的,所以,請求認證的過濾器肯定包含他。未完待續(xù),下一篇介紹資源服務(wù)器和認證服務(wù)器的集成。 基于spring-security-oauth2-實現(xiàn)單點登錄 文章代碼地址:鏈接描述可以下載直接運行,基于springboot2.1.5,springcloud Green...

    妤鋒シ 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<