SpringBoot如何整合Springsecurity實(shí)現(xiàn)數(shù)據(jù)庫(kù)登錄及權(quán)限控制
我們今天使用SpringBoot來整合SpringSecurity,來吧,不多BB
首先呢,是一個(gè)SpringBoot 項(xiàng)目,連接數(shù)據(jù)庫(kù),這里我使用的是mybaties.mysql, 下面是數(shù)據(jù)庫(kù)的表
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 '注冊(cè)時(shí)間', 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)建完了之后呢, 我們就開始寫代碼了
第一步
我們要?jiǎng)?chuàng)建spring security 的配置文件, 因?yàn)榇a太長(zhǎng),所以我就直接截圖了, 小伙伴們不要想著COPY代碼哦,要自己手寫代碼
然后是一個(gè)實(shí)現(xiàn)了UserDetialsServer的類
這個(gè)類主要是實(shí)現(xiàn)了loadUserByname方法, 然后我們可以在這個(gè)類中注入我們的service 或者直接mapper接口, 然后方法內(nèi)部根據(jù)username獲得該用戶, 然后再獲取這個(gè)用戶的權(quán)限
第二步是封裝一個(gè)自定義的類
該類實(shí)現(xiàn)了UserDetials 接口, 然后里面有用戶對(duì)象, 角色對(duì)象(也可以是一個(gè)角色泛型的list集合)這個(gè)自定義的類實(shí)現(xiàn)了這個(gè)幾個(gè)方法
最重要的是第一個(gè)方法, 他會(huì)吧當(dāng)前用戶的角色存起來, 只有兩段代碼 我就不多說了, 下面就是一些賬戶密碼可不可用什么的。
再回頭來說我們的loadUserByName方法, 我們把角色和用戶都set到這個(gè)類里面,然后返回。
這個(gè)一步只是驗(yàn)證有沒有這個(gè)用戶,或者是這個(gè)賬戶能不能用
第三步, 我們需要判斷密碼啦
一個(gè)實(shí)現(xiàn)了AuthenticationProvider的類, 注入我們的CustmUserService, 然后從Authentication取得賬號(hào)和密碼,調(diào)用loadUserByName方法獲得賬戶信息, 再和頁面輸入的密碼進(jìn)行比對(duì), 如果不能用就拋異常, 如果能用的活,就把賬戶,賬戶密碼, 賬戶權(quán)限(角色)構(gòu)建成UsernamePasswordAuthenticationToken返回,
下面是我的登錄頁面代碼
這就完成了登錄功能, 小伙伴們,一定要先按照我的代碼寫。 然后再自己去寫(因?yàn)橛行〇|西說的不詳細(xì))
然后我們?cè)倏礄?quán)限功能
/test1 是只有super_admin才能訪問的, /test2 是只有shopping_admin才能訪問的(是有缺點(diǎn)的)
當(dāng)然這里的話 是這樣寫就行, 我們?cè)倏错撁嫔系?/p>
這里其實(shí)是有坑的, 為什么呢, 我們debug查看hasRole的源碼
在我標(biāo)箭頭的這里, 如果你網(wǎng)頁上寫的參數(shù)不帶ROLE_的話,他會(huì)強(qiáng)制給你加上, 然后如果你數(shù)據(jù)庫(kù)里面的角色是admin,網(wǎng)頁里面寫的也是admin, 在這個(gè)就會(huì)用admin和ROLE_admin 匹配, 然后就不行
我的解決方法目前有兩種: 1.數(shù)據(jù)庫(kù)里面的角色就加上ROLE_
2. 添加角色時(shí)加上ROLE_
還有個(gè)問題就是第一張圖那個(gè)的hasRole不能加ROLE_, 如果加了就會(huì)報(bào)錯(cuò), 第一個(gè)加了沒錯(cuò), 第二個(gè)加了就報(bào)錯(cuò)了
那么該用第幾種方法呢?
總結(jié)
到此這篇關(guān)于SpringBoot如何整合Springsecurity實(shí)現(xiàn)數(shù)據(jù)庫(kù)登錄及權(quán)限控制的文章就介紹到這了,更多相關(guān)SpringBoot整合Springsecurity實(shí)現(xiàn)數(shù)據(jù)庫(kù)登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot基于SpringSecurity表單登錄和權(quán)限驗(yàn)證的示例
- Springboot整合SpringSecurity實(shí)現(xiàn)登錄認(rèn)證和鑒權(quán)全過程
- Springboot+SpringSecurity實(shí)現(xiàn)圖片驗(yàn)證碼登錄的示例
- SpringSecurity整合springBoot、redis實(shí)現(xiàn)登錄互踢功能
- springboot+jwt+springSecurity微信小程序授權(quán)登錄問題
- SpringBoot 配合 SpringSecurity 實(shí)現(xiàn)自動(dòng)登錄功能的代碼
- SpringBoot + SpringSecurity 短信驗(yàn)證碼登錄功能實(shí)現(xiàn)
- SpringBoot+SpringSecurity處理Ajax登錄請(qǐng)求問題(推薦)
- SpringBoot整合Springsecurity實(shí)現(xiàn)數(shù)據(jù)庫(kù)登錄及權(quán)限控制功能
相關(guān)文章
Java多線程正確使用倒計(jì)時(shí)協(xié)調(diào)器CountDownLatch方法詳解
這篇文章主要為大家介紹了Java多線程倒計(jì)時(shí)協(xié)調(diào)器CountDownLatch的正確使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09linux配置jdk環(huán)境變量簡(jiǎn)單教程
這篇文章主要為大家詳細(xì)介紹了linux配置jdk環(huán)境變量簡(jiǎn)單教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Spring?Boot配置文件的語法規(guī)則詳解(properties和yml)
這篇文章主要介紹了Spring?Boot配置文件的語法規(guī)則,主要介紹兩種配置文件的語法和格式,properties和yml,對(duì)于配置文件也有獨(dú)立的文件夾存放,主要用來存放一些需要經(jīng)過變動(dòng)的數(shù)據(jù)(變量值),感興趣的朋友跟隨小編一起看看吧2024-07-07SpringBoot熔斷機(jī)制之CircuitBreaker詳解
這篇文章主要介紹了SpringBoot熔斷機(jī)制之CircuitBreaker詳解,SpringBoot的熔斷機(jī)制在微服務(wù)架構(gòu)中扮演著重要角色,其中CircuitBreaker是其核心機(jī)制之一,用于防止服務(wù)的異常狀態(tài)影響到整個(gè)系統(tǒng)的運(yùn)作,需要的朋友可以參考下2023-10-10Java設(shè)計(jì)模式之橋梁(Bridge)模式
這篇文章主要介紹了Java設(shè)計(jì)模式之橋梁(Bridge)模式,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java設(shè)計(jì)模式的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05Java工具類BeanUtils庫(kù)介紹及實(shí)例詳解
這篇文章主要介紹了Java工具類BeanUtils庫(kù)介紹及實(shí)例詳解,需要的朋友可以參考下2020-02-02Java StringBuilder類相關(guān)知識(shí)總結(jié)
這篇文章主要介紹了Java StringBuilder類相關(guān)知識(shí)總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02