要理解shiro,我們必須首先理解框架的幾個概念:
1)Subject:表示當前登錄或訪問的用戶;
2)Principals:壹般指用戶名等。,而唯壹表明主體身份的是當前用戶的身份;
3)憑證:憑證,壹般指密碼,用於驗證當前登錄的用戶;
4)Realms:域,壹般指存儲用戶信息(用戶名、密碼、權限和角色)的數據庫,即存儲用戶權限等信息的數據源;
5)安全管理器:Shiro安全管理的頂層對象。它組裝或調用所有其他相關組件,並負責所有與安全和權限相關的流程,就像壹個中央政府壹樣;
2.shiro子系統
前面提到的shiro的主要功能有:認證、授權、加密、會話管理等。並且每個主要功能對應於shiro的壹個子系統,下面將單獨介紹。
3.認證認證子系統
認證子系統用於處理用戶登錄和驗證用戶登錄。
壹般我們新建壹個UsernamePasswordToken的對象:username password token = new username password token(“XXX用戶名”、“XXX密碼”);,
然後是subject . log in(token);登錄就好。相關代碼通常如下:
身份驗證子系統將加密密碼,然後根據用戶名使用用戶名和加密的密碼與從領域(通常是數據庫)獲得的密碼進行比較。如果相同,登錄將成功,如果不同,登錄將失敗,或者如果用戶名不存在,登錄將失敗。就這麽簡單當然,根據用戶名從Realm中查找用戶的過程需要通過我們自己的編碼來實現。該函數的實現代碼如下。
4.授權授權子系統(訪問控制、權限控制)
當需要判斷用戶是否具有某種權利或角色時,代碼如下:
我們看到doGetAuthorizationInfo方法使用SimpleAuthorizationInfo類來封裝Role和Permission.roles和stringPermissions都是String類型的集合,也就是說,它們都使用字符串來表示您具有某個角色或權限。
1)兩種訪問控制方法:
SimpleAuthorizationInfo封裝了角色和權限,實際上解釋了實現“訪問控制”的兩種方式:壹種是“基於角色的訪問控制”;而是“基於資源的訪問控制”。所謂訪問控制是指當前用戶是否有權訪問某個資源。基於角色的訪問控制是壹種粗粒度訪問控制方法。只要您擁有壹個或多個角色,就可以訪問資源。基於資源的訪問控制是判斷妳是否有壹定的權限訪問資源,粒度更細。妳可以根據妳擁有哪些角色來判斷妳是否擁有某種權利,然後判斷妳擁有哪些權利來轉換角色。當然,也可以不引入角色的概念,直接判斷自己是否擁有壹定的權限。當然,這兩種訪問方法可以單獨使用,也可以混合使用。例如,對於相對簡單的訪問控制,您可以只使用基於角色的訪問控制,只引入角色表,而不需要權限表。混合使用意味著您可以要求用戶同時擁有特定角色和特定權限,以便訪問特定資源。因此,shiro的權限控制極其靈活(當然,也可以只引入權限表而不引入角色表)。
2 .權限的字符串表示
上面提到的角色和權限是用字符串表示的。實際上,shiro提供了壹組功能強大但有些復雜的權限字符串表示格式(分為三部分):“Resource:Operation:Object Instance ID”指示可以對該資源的哪個實例執行哪些操作,並且支持通配符。多個操作之間需要用“、”逗號分隔,“*”放在三個位置,分別代表:任意資源、任意操作、任意實例。例如,“user:delete:1”表示可以刪除用戶表的id等於1的數據或對象。實際上,資源表示的實現可以是壹個對象,但實際上它最終對應的是數據庫表中的記錄。另壹個例子:“user:update,delete”意味著更新和刪除用戶表(的任何實例)。“user:update,delete”實際上相當於“user:update,delete:*”,因此shiro的訪問控制可以控制到特定的實例,或特定的數據庫記錄,或在表級別。如果省略了對象實例ID部分,則在表級別對其進行控制。
3)權限相關表的設計
1》如果對於壹個簡單的案例,我們只能使用“基於角色的訪問控制”的粗粒度模式,僅通過判斷是否存在某個角色來判斷訪問控制,那麽我們只需要添加壹個角色表(roles)和壹個角色和用戶的多對多中間表-用戶角色表(user_role)。
2 & gt如果訪問僅由權限控制,則只能添加壹個權限表(priv)和壹個用戶和權限的多對多中間表-用戶權限表(user_priv)。
3 & gt如果要同時使用角色和權限(權限是根據角色計算的),那麽需要添加:角色表、用戶角色表、權限表和角色權限表。
4》其實還有壹種情況:角色與權限無關,可以添加:角色表、用戶角色表、權限表、用戶權限表。但是,這種方法不同,符合慣例。
其他如密碼學加密子系統和會話管理會話管理子系統在此不再介紹。