shiro框架---通過系統介紹shiro框架中的實現邏輯
本篇主要通過一個已經實現使用者登入和許可權驗證的系統,結合sql,展示一下我的實現。
首先我設定的許可權,即功能表,其中func_type
欄位分為四類(系統、模組、選單、操作)。
一、系統的展示
下邊對於同一個系統內,一個使用者,我在不同授權下的展示情況:
不好意思,公司系統,我還是不要全貼出來了。
當前使用者我是授權的是測試角色
,對於當前的角色我賦予的是以上的功能,即只顯示了首頁、系統管理、資源管理三個模組,以及部分選單。下邊是我對當前使用者授權的測試角色
然後我再將當前使用者改為賦予測試角色2
,來看一下效果。
以上,我只是貼出來對於功能的系統、模組、選單的三種分類,對於操作類,在這裡其實就是按鈕的控制。而對於按鈕的控制,我是通過shiro標籤來實現的,但是前三種,實際上就是根據sql查詢返回給前端的。
對於上圖中的系統類,其實儲存在功能表中,是將那個圖片,比如test.png
func_url
欄位上 對於上圖中的模組類,其實多加了一級,用來將選單類歸類一下,
func_url
上儲存的是空字串。 對於上圖中的選單類,這個是主要的內容,其實只是將前端對於某個jsp的路徑,比如
/views/test.jsp
這樣的字串,儲存到func_url
欄位上。 當然以上三種,都要儲存到對應的
func_type
欄位,即要選對相應的功能型別。
二、基於sql的實現
角色上授予不同功能
這裡其實就是拿著當前角色的id,還有勾選的多個功能id,然後去添加了多條角色功能關聯表的記錄。這樣就將當前角色id與多種功能關聯起來了。
使用者上授予不同角色
這裡的使用者,當然可以授予多個角色,這裡我僅僅只是授予了一個角色,不管幾個,其實也就是在儲存的時候,去新增使用者角色關聯表,將使用者id和角色id關聯起來。這樣就在一個使用者上綁定了多個角色,如果你這些角色上帶有對應的site_id
,即站點,那相當於你可以對當前使用者賦予多個系統站點的角色,這樣在登入的時候,可以通過site_id
來篩選是否有某個系統的登入許可權了。有些人可能覺得siteid
應該放到功能表裡,我這裡放到角色裡,是方便於在登入系統驗證的時候少關聯兩張表,只要自己合理應用,我覺得沒問題。
以下是使用者在授予多個角色下結構圖,挺簡單的:
使用者登入後,獲取當前站點的角色的所有許可權,這也是我最上邊的實現sql
即select distinct f.* from sys_User u,Sys_User_Role_R ur,sysy_Role r,Sys_Func_Role_R fr,Sys_Func f where u.user_id = ur.user_Id and ur.role_Id=r.id and r.id=fr.role_Id and fr.func_Id=f.id and u.user_name='lsf' and r.site_id='1' and f.func_type !=4
就是將這五張表關聯一下,然後根據使用者表的user_name
欄位和角色表的site_id
來查詢出屬於當前使用者的站點1系統的功能列表,上邊func_type != 4
表示不查詢按鈕類的功能,因為按鈕類我是通過shiro的標籤來控制的。關於shiro標籤的應用,看這篇文章,shiro框架—關於專案按鈕許可權控制的配置要點。
這樣在使用者登入該系統後,就可以根據該sql,查詢出來屬於當前使用者,當前系統的所有功能列表。返回給前端,前端再根據不同的功能型別(沒有返回按鈕,即型別為4的功能),分類,從func_url
中獲取出值來,填充到前端的樣式中,這樣就實現了不同使用者與功能的關聯。
說到這裡,我覺得肯定還有人有疑問,我這樣返回,前端怎麼實現,其實這個很好實現,另外,我覺得不要關心前端如何展示,我們只需要關心實現根據不同使用者,不同系統,返回相應的結果即可,其他的等你看到一次前端怎麼實現的就知道有多簡單了。
下一篇,進入shiro框架在系統專案中的配置介紹
下一篇文章shiro框架—shiro配置介紹(一)