1. 程式人生 > >SpringBoot整合Springsecurity實現資料庫登入以及許可權控制

SpringBoot整合Springsecurity實現資料庫登入以及許可權控制

我們今天使用SpringBoot來整合SpringSecurity,來吧,不多BB

首先呢,是一個SpringBoot 專案,連線資料庫,這裡我使用的是mybaties.mysql, 下面是資料庫的表

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,'網站管理員'),

(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='網站管理員';

/*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);

表建立完了之後呢, 我們就開始寫程式碼了

第一步

我們要建立spring security 的配置檔案, 因為程式碼太長,所以我就直接截圖了, 小夥伴們不要想著COPY程式碼哦,要自己手寫程式碼

然後是一個實現了UserDetialsServer的類

這個類主要是實現了loadUserByname方法, 然後我們可以在這個類中注入我們的service 或者直接mapper介面, 然後方法內部根據username獲得該使用者, 然後再獲取這個使用者的許可權

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

該類實現了UserDetials 介面, 然後裡面有使用者物件, 角色物件(也可以是一個角色泛型的list集合)這個自定義的類實現了這個幾個方法

最重要的是第一個方法, 他會吧當前使用者的角色存起來, 只有兩段程式碼 我就不多說了, 下面就是一些賬戶密碼可不可用什麼的。

再回頭來說我們的loadUserByName方法, 我們把角色和使用者都set到這個類裡面,然後返回。

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

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

   一個實現了AuthenticationProvider的類, 注入我們的CustmUserService, 然後從Authentication取得賬號和密碼,呼叫loadUserByName方法獲得賬戶資訊, 再和頁面輸入的密碼進行比對, 如果不能用就拋異常, 如果能用的活,就把賬戶,賬戶密碼, 賬戶許可權(角色)構建成UsernamePasswordAuthenticationToken返回, 

下面是我的登入頁面程式碼

這就完成了登入功能, 小夥伴們,一定要先按照我的程式碼寫。 然後再自己去寫(因為有些東西說的不詳細)

然後我們再看許可權功能

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

當然這裡的話 是這樣寫就行, 我們再看頁面上的

這裡其實是有坑的, 為什麼呢, 我們debug檢視hasRole的原始碼

在我標箭頭的這裡, 如果你網頁上寫的引數不帶ROLE_的話,他會強制給你加上, 然後如果你資料庫裡面的角色是admin,網頁裡面寫的也是admin, 在這個就會用admin和ROLE_admin 匹配, 然後就不行

我的解決方法目前有兩種: 1.資料庫裡面的角色就加上ROLE_ 

                                            2. 新增角色時加上ROLE_

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

那麼該用第幾種方法呢?