1. 程式人生 > >shiro框架---通過系統介紹shiro框架中的實現邏輯

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配置介紹(一)