1. 程式人生 > >Spring與Shiro整合 載入許可權表示式

Spring與Shiro整合 載入許可權表示式

Spring與Shiro整合 載入許可權表示式

作者 : Stanley 羅昊

【轉載請註明出處和署名,謝謝!】

如何載入許可權表示式 

我們在上章內容中畫了一張圖,裡面有三個分項,使用者 角色 許可權;

那麼接下來我們就要思考一個問題了,這三張表中的資料要從何而來呢?

使用者表

首先先看使用者表,使用者表的資料庫是從使用者註冊而來;

角色

角色的話肯定是我們手動去創建出來,但是我們在建立角色之前呢?是不是需要先有許可權後才能去建立角色呢?因為角色是依賴於許可權,只要先有了許可權,我們就可以講它們歸類,分配給我們某一個角色;

所以我們的突破口就是,許可權該如何去載入這個問題;

我們可以開啟我們的Cotroller在介面上可以看到凡是帶有Shiro註解的,都是需要有相對應的許可權才可以訪問的:

 

重新載入許可權

 那,問題就來了,我們如何將註解中的許可權表示式(employee:edit)存入到資料庫中呢?

我們在之前的操作中,是手動的將表示式複製貼上到資料庫中,也就是手動新增進去的,那你想一下,如果需要新增非常多的許可權,我們還依然用手動的方式,顯然非常麻煩!

那我們能不能想一種辦法,就是讓使用者一點選或進入這個介面執行一個方法馬上讓它把所有Cotroller中的許可權表示式給全部拿出來存入到資料庫中;

能不能做到呢?

答案是可以的!

 

 我們在頁面上有一個功能是重新載入許可權,這個意思就是我們點選後,你加下來的編碼,給某給介面新增某項許可權的時候,就會幫你把所有Cotrolle中的新新增的許可權重新的儲存到資料庫中;

這個按鈕就是一個Url,點選後就進入到了我們在Cotroller編寫的介面方法中:

 

 接下來,我們就來看下這個reload介面是如何編寫的:

 

 

 中間的部分就是獲取許可權表示式,畫箭頭的是呼叫了接j口執行的Sql儲存操作也就是insert;

此次的介面是物件儲存的方式,介面的具體編寫也非常簡單,其實就跟使用者註冊一樣,將name(許可權名稱)resource(表示式)作為插入欄位即可;

 

 

 

然後在方面結尾呼叫介面,需要傳入一個物件,這個物件(Permisssion  p )就是我們存進去的許可權名稱以及表示式物件;

具體Sql語句編寫方式:

insert into permission (name,resource) values("permissionName","PermissionResource");

編寫自定義註解來獲取許可權暱稱

我們在reload介面中,拿到的僅僅都是表示式,和獲取Requesmapping,但是我們在資料庫中有一列是許可權名稱,因為光靠表示式並非知道它的中文意思,所以我們需要自定義註解,從而獲取註解內部的中文詮釋;

 

 

 我們可以看到,這個註解是會報錯的,因為這個註解並不是spring或java內建的,更不是第三方依賴的jar包,而是需要我們自定義,所以,自定義註解名字可以隨便起,但是一定要有意義;

我們來看看自定義註解是如何建立的;

1.編寫好自己的註解

就按照上圖的例子我起的名字是@PermissionName;

2.建立一個註解在realm路徑下(根據公司專案的結構定義)

 

 

 注意,Kind:一定選擇Annotation(自定義註解);Name可以隨便起,但是一定要有意義,我這裡直接叫PermissionName就好了;

我這裡就把註解建立在realm目錄下,因為畢竟這個也是Shiro的一部分,也可以將它放入到工具包下也可以,根據公司的專案結構來,如果這是一個新加入的功能,推薦放入realm包下,並在內打上註解介紹;

3.編寫自定義註解類

 

 

 該註解僅僅獲取許可權名稱使用,以上結構寫死即可;

解決重複插入問題(去重)

編寫完成後,我們開始進入測試,我們來看看是否可以執行成功,將許可權名稱以及表示式儲存進資料庫中:

 

 

 執行成功,以及載入了全部的許可權列表,並且都儲存至資料庫中;

但是問題來了,如果我們再次點選載入許可權列表會怎麼樣?

 

 

 我們發現,重複添加了,這種情況在實際開發當中是絕對不允許的,如何解決呢?

去重操作

我們需要在PermissionController類中第0步,再新增一個功能,就是去重;

這個時候,我們需要去呼叫介面去資料庫中查詢一下,看看是否有重複,如果重複,我們就跳過,如果沒重複,我們就儲存進來;

1.我們編寫獲取所有員工許可權的介面

/**
獲取所有許可權表示式
*/
List<String>getAllResources();

2.編寫Sql

select resource From permission; 

permission就是表,resource是其中的列(許可權表示式);我們僅需獲取這一個列即可

3.編寫實現類

實現類就非常簡單,掉Mapper層,執行sql,用集合接收,資料接收到後,直接retrun過去即可;

4.在Controller類中呼叫

 

 畫箭頭就是新加入的內容,根據以上指引編寫即可