Apache Shiro 基於許可權授權

2021-06-20 10:44:07 字數 1692 閱讀 8703

授權即是訪問控制,是對資源訪問的管理過程。它將判斷使用者在應用程式中是否對資源有相應的訪問許可權。

但現在很多程式都使用隱式的角色進行訪問控制,定義乙個角色來代表一系列的操作。當需要對某一操作進行授權驗證時,只需判斷是否擁有該角色即可。

行為已被乙個單獨的名字所蘊含。這種角色許可權相對簡單、模糊,不利於擴充套件。

比如:定義乙個角色「專案經理」,這只是乙個普通的字串名稱,但它包含了一系列的行為(新增或刪除員工到專案,生成專案報告等等)。這個角色所包含的含義根據專案來自己定義,你可能並不清楚這個角色究竟代表什麼含義。當需要判斷時一般開發人員都要這麼寫:

if (user.hasrole("專案經理") )  else
當安全策略發生變更時,這種授權方式非常脆弱。比如,需要新增乙個角色「部門經理」也能檢視專案報告的話,開發人員就需要修改**:

if (user.hasrole("專案經理") || user.hasrole("部門經理") )  else
這種方式無法支援程式在執行時動態地建立或刪除角色。

訪問控制的本質是保護哪些資源以及檢查使用者對這些資源是否具有相應的行為,當你把它分解到這個最原始的水平時候,你就可以將安全策略描述在乙個更細粒度的和更加彈性的方式。

修改一下上面的**:

if (user.ispermitted("專案報告:檢視:12345"))  else
專案報告是資源,檢視是行為,12345是專案報告的id(即資源的屬性)。這種實現方式顯式地表明了資源與行為之間的關係,並能明確地定義特定資源例項的操作行為實現了例項級的訪問控制。這樣**在做安全性檢查時不需要知道行為是如何關聯的,並可以在程式執行過程中依據安全策略改變這些關聯。

在shiro中如果你想檢查乙個subject 是否被允許做某事,你可以呼叫各種ispermitted*方法。檢查許可權主要有兩個方式——基於物件的許可權例項或代表許可權的字串。

例如:

subject.ispermitted("queryprinter")

subject.ispermitted( new wildcardpermission("queryprinter"))

許可權分為三個部分:資源,行為和資源屬性。三部分之間用冒號分隔,各子部分又可以用逗號分隔,支援星號作為萬用字元。

示例:

printer:query

printer:query:lp7200

printer:print,query

printer:query,print:lp7200

printer:print:*

printer:*:*

printer:*

printer:print 等於 printer:print:*

printer 等於 printer:*:*

printer:lp7200 不等於 printer:*:lp7200

判斷許可權是在org.apache.shiro.authz.permission.wildcardpermission類的implies方法中實現的,支援了萬用字元規則。

對於習慣了基於角色的訪問控制方式,你也可以直接給角色分配許可權。可以定義乙個顯式角色,乙個顯式角色本質上是乙個授權宣告的命名集合。

授權驗證時,需要判斷當前角色是否擁有該許可權。這種角色許可權可以對該角色進行詳細的許可權描述,適合更複雜的許可權設計。

Apache Shiro許可權控制收藏

本文是來自codekiller的一系列關於apache shiro使用,收藏了!謝謝codekiller的分享!springmvc apache shiro jpa hibernate 案例教學 一 整合配置 springmvc apache shiro jpa hibernate 案例教學 二 基...

專案許可權控制的管家 Apache Shiro框架

在學習apache shiro框架之前,我們要清楚apacheshiro框架能夠幫助我們完成什麼功能呢?以下就是apache shiro框架所能做的事情 1 驗證使用者。2 在任何環境下都可以使用sessionapi。3 可以使用多個使用者資料庫。例如乙個是oracle資料庫,另外乙個是masql資...

Apache Shiro 授權概念

授權即是訪問控制,是對資源訪問管理過程。它將判斷使用者在應用程式中是否對資源有相應的訪問許可權。比如 判斷乙個使用者有檢視頁面的許可權,編輯資料的許可權,擁有某一按鈕的許可權,以及是否擁有列印的許可權等等。授權有三個核心元素 許可權,角色和使用者。1 許可權 在apache shiro 中許可權是安...