溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制

發(fā)布時間:2022-01-05 11:06:12 來源:億速云 閱讀:175 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制”這篇文章吧。

首先呢,是一個SpringBoot 項目,連接數(shù)據(jù)庫,這里我使用的是mybaties.mysql, 下面是數(shù)據(jù)庫的表

DROP TABLE IF EXISTS `xy_role`;
 
CREATE TABLE `xy_role` (
  `xyr_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `xyr_name` char(30) DEFAULT NULL COMMENT '角色名稱',
  PRIMARY KEY (`xyr_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='角色';
 
/*Data for the table `xy_role` */
 
insert  into `xy_role`(`xyr_id`,`xyr_name`) values 
 
(1,'ROLE_SUPERADMIN'),
 
(2,'網(wǎng)站管理員'),
 
(3,'ROLE_SHOPADMIN');
 
 
DROP TABLE IF EXISTS `xy_webadmin`;
 
CREATE TABLE `xy_webadmin` (
  `xywb_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `xywb_username` char(30) DEFAULT NULL COMMENT '用戶名',
  `xyr_id` int(11) DEFAULT NULL COMMENT '角色',
  `xywb_password` char(50) DEFAULT NULL COMMENT '密碼',
  `xywb_registertime` bigint(20) DEFAULT NULL COMMENT '注冊時間',
  PRIMARY KEY (`xywb_id`),
  KEY `FK_Reference_37` (`xyr_id`),
  CONSTRAINT `FK_Reference_37` FOREIGN KEY (`xyr_id`) REFERENCES `xy_role` (`xyr_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='網(wǎng)站管理員';
 
/*Data for the table `xy_webadmin` */
 
insert  into `xy_webadmin`(`xywb_id`,`xywb_username`,`xyr_id`,`xywb_password`,`xywb_registertime`) values 
 
(1,'haiwei',1,'123456',1983),
 
(2,'admin',3,'123456',1983),
 
(3,'admin1',2,'123456',NULL);

表創(chuàng)建完了之后呢, 我們就開始寫代碼了

第一步

我們要創(chuàng)建spring security 的配置文件, 因為代碼太長,所以我就直接截圖了, 小伙伴們不要想著COPY代碼哦,要自己手寫代碼

SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制

然后是一個實現(xiàn)了UserDetialsServer的類

這個類主要是實現(xiàn)了loadUserByname方法, 然后我們可以在這個類中注入我們的service 或者直接mapper接口, 然后方法內(nèi)部根據(jù)username獲得該用戶, 然后再獲取這個用戶的權(quán)限

第二步是封裝一個自定義的類

該類實現(xiàn)了UserDetials 接口, 然后里面有用戶對象, 角色對象(也可以是一個角色泛型的list集合)這個自定義的類實現(xiàn)了這個幾個方法

SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制

最重要的是第一個方法, 他會吧當(dāng)前用戶的角色存起來, 只有兩段代碼 我就不多說了, 下面就是一些賬戶密碼可不可用什么的。

再回頭來說我們的loadUserByName方法, 我們把角色和用戶都set到這個類里面,然后返回。

這個一步只是驗證有沒有這個用戶,或者是這個賬戶能不能用

第三步, 我們需要判斷密碼啦

一個實現(xiàn)了AuthenticationProvider的類, 注入我們的CustmUserService, 然后從Authentication取得賬號和密碼,調(diào)用loadUserByName方法獲得賬戶信息, 再和頁面輸入的密碼進(jìn)行比對, 如果不能用就拋異常, 如果能用的活,就把賬戶,賬戶密碼, 賬戶權(quán)限(角色)構(gòu)建成UsernamePasswordAuthenticationToken返回, 

SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制

下面是我的登錄頁面代碼

SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制

這就完成了登錄功能, 小伙伴們,一定要先按照我的代碼寫。 然后再自己去寫(因為有些東西說的不詳細(xì))

然后我們再看權(quán)限功能

SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制

/test1 是只有super_admin才能訪問的, /test2 是只有shopping_admin才能訪問的(是有缺點的)

當(dāng)然這里的話 是這樣寫就行, 我們再看頁面上的

SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制

這里其實是有坑的, 為什么呢, 我們debug查看hasRole的源碼

SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制

在我標(biāo)箭頭的這里, 如果你網(wǎng)頁上寫的參數(shù)不帶ROLE_的話,他會強(qiáng)制給你加上, 然后如果你數(shù)據(jù)庫里面的角色是admin,網(wǎng)頁里面寫的也是admin, 在這個就會用admin和ROLE_admin 匹配, 然后就不行

我的解決方法目前有兩種: 1.數(shù)據(jù)庫里面的角色就加上ROLE_ 

                                            2. 添加角色時加上ROLE_

還有個問題就是第一張圖那個的hasRole不能加ROLE_, 如果加了就會報錯, 第一個加了沒錯, 第二個加了就報錯了

SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制

以上是“SpringBoot怎么整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI