最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Apache Shiro 使用手冊(三) Shiro授權

 更新時間:2014年06月09日 23:37:21   作者:  
授權即訪問控制,它將判斷用戶在應用程序中對資源是否擁有相應的訪問權限

如,判斷一個用戶有查看頁面的權限,編輯數(shù)據(jù)的權限,擁有某一按鈕的權限,以及是否擁有打印的權限等等。

一、授權的三要素

授權有著三個核心元素:權限、角色和用戶。

權限

權限是Apache Shiro安全機制最核心的元素。它在應用程序中明確聲明了被允許的行為和表現(xiàn)。一個格式良好好的權限聲明可以清晰表達出用戶對該資源擁有的權限。
大多數(shù)的資源會支持典型的CRUD操作(create,read,update,delete),但是任何操作建立在特定的資源上才是有意義的。因此,權限聲明的根本思想就是建立在資源以及操作上。

而我們通過權限聲明僅僅能了解這個權限可以在應用程序中做些什么,而不能確定誰擁有此權限。
于是,我們就需要在應用程序中對用戶和權限建立關聯(lián)。
通常的做法就是將權限分配給某個角色,然后將這個角色關聯(lián)一個或多個用戶。

權限聲明及粒度

Shiro權限聲明通常是使用以冒號分隔的表達式。就像前文所講,一個權限表達式可以清晰的指定資源類型,允許的操作,可訪問的數(shù)據(jù)。同時,Shiro權限表達式支持簡單的通配符,可以更加靈活的進行權限設置。
下面以實例來說明權限表達式。
可查詢用戶數(shù)據(jù)
User:view
可查詢或編輯用戶數(shù)據(jù)
User:view,edit
可對用戶數(shù)據(jù)進行所有操作
User:* 或 user
可編輯id為123的用戶數(shù)據(jù)
User:edit:123

角色

Shiro支持兩種角色模式:
1、傳統(tǒng)角色:一個角色代表著一系列的操作,當需要對某一操作進行授權驗證時,只需判斷是否是該角色即可。這種角色權限相對簡單、模糊,不利于擴展。
2、權限角色:一個角色擁有一個權限的集合。授權驗證時,需要判斷當前角色是否擁有該權限。這種角色權限可以對該角色進行詳細的權限描述,適合更復雜的權限設計。
下面將詳細描述對兩種角色模式的授權實現(xiàn)。

二、授權實現(xiàn)

Shiro支持三種方式實現(xiàn)授權過程:
編碼實現(xiàn)
注解實現(xiàn)
JSP Taglig實現(xiàn)
1、基于編碼的授權實現(xiàn)

1.1基于傳統(tǒng)角色授權實現(xiàn)
當需要驗證用戶是否擁有某個角色時,可以調用Subject 實例的hasRole*方法驗證。


復制代碼 代碼如下:

Subject currentUser = SecurityUtils.getSubject();
if (currentUser.hasRole("administrator")) {
    //show the admin button
} else {
    //don't show the button?  Grey it out?
}


相關驗證方法如下: 
Subject方法 描述
hasRole(String roleName) 當用戶擁有指定角色時,返回true
hasRoles(List<String> roleNames) 按照列表順序返回相應的一個boolean值數(shù)組
hasAllRoles(Collection<String> roleNames) 如果用戶擁有所有指定角色時,返回true

斷言支持

Shiro還支持以斷言的方式進行授權驗證。斷言成功,不返回任何值,程序繼續(xù)執(zhí)行;斷言失敗時,將拋出異常信息。使用斷言,可以使我們的代碼更加簡潔。

復制代碼 代碼如下:

Subject currentUser = SecurityUtils.getSubject();
//guarantee that the current user is a bank teller and
//therefore allowed to open the account:
currentUser.checkRole("bankTeller");
openBankAccount();

斷言的相關方法: 

Subject方法 描述
checkRole(String roleName) 斷言用戶是否擁有指定角色
checkRoles(Collection<String> roleNames) 斷言用戶是否擁有所有指定角色
checkRoles(String... roleNames) 對上一方法的方法重載

1.2 基于權限角色授權實現(xiàn)

相比傳統(tǒng)角色模式,基于權限的角色模式耦合性要更低些,它不會因角色的改變而對源代碼進行修改,因此,基于權限的角色模式是更好的訪問控制方式。
它的代碼實現(xiàn)有以下幾種實現(xiàn)方式:

1、基于權限對象的實現(xiàn)

創(chuàng)建org.apache.shiro.authz.Permission的實例,將該實例對象作為參數(shù)傳遞給Subject.isPermitted()進行驗證。

復制代碼 代碼如下:

Permission printPermission = new PrinterPermission("laserjet4400n", "print");
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.isPermitted(printPermission)) {
    //show the Print button
} else {
    //don't show the button?  Grey it out?
}
Permission printPermission = new PrinterPermission("laserjet4400n", "print");
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.isPermitted(printPermission)) {
    //show the Print button
} else {
    //don't show the button?  Grey it out?
}

相關方法如下: 

Subject方法 描述
isPermitted(Permission p) Subject擁有制定權限時,返回treu
isPermitted(List<Permission> perms) 返回對應權限的boolean數(shù)組
isPermittedAll(Collection<Permission> perms) Subject擁有所有制定權限時,返回true

2、基于字符串的實現(xiàn)

相比笨重的基于對象的實現(xiàn)方式,基于字符串的實現(xiàn)便顯得更加簡潔。

復制代碼 代碼如下:

Subject currentUser = SecurityUtils.getSubject();
if (currentUser.isPermitted("printer:print:laserjet4400n")) {
    //show the Print button
} else {
    //don't show the button?  Grey it out?
}

使用冒號分隔的權限表達式是org.apache.shiro.authz.permission.WildcardPermission 默認支持的實現(xiàn)方式。
這里分別代表了 資源類型:操作:資源ID

類似基于對象的實現(xiàn)相關方法,基于字符串的實現(xiàn)相關方法:
isPermitted(String perm)、isPermitted(String... perms)、isPermittedAll(String... perms)

基于權限對象的斷言實現(xiàn)

復制代碼 代碼如下:

Subject currentUser = SecurityUtils.getSubject();
//guarantee that the current user is permitted
//to open a bank account:
Permission p = new AccountPermission("open");
currentUser.checkPermission(p);
openBankAccount();

基于字符串的斷言實現(xiàn)

復制代碼 代碼如下:

Subject currentUser = SecurityUtils.getSubject();
//guarantee that the current user is permitted
//to open a bank account:
currentUser.checkPermission("account:open");
openBankAccount();

斷言實現(xiàn)的相關方法 

Subject方法 說明
checkPermission(Permission p) 斷言用戶是否擁有制定權限
checkPermission(String perm) 斷言用戶是否擁有制定權限
checkPermissions(Collection<Permission> perms) 斷言用戶是否擁有所有指定權限
checkPermissions(String... perms) 斷言用戶是否擁有所有指定權限

2、基于注解的授權實現(xiàn)
Shiro注解支持AspectJ、Spring、Google-Guice等,可根據(jù)應用進行不同的配置。

相關的注解:
@ RequiresAuthentication
可以用戶類/屬性/方法,用于表明當前用戶需是經(jīng)過認證的用戶。

復制代碼 代碼如下:

@RequiresAuthentication
public void updateAccount(Account userAccount) {
    //this method will only be invoked by a
    //Subject that is guaranteed authenticated
    ...
}

@ RequiresGuest
表明該用戶需為”guest”用戶

@ RequiresPermissions
當前用戶需擁有制定權限

復制代碼 代碼如下:

@RequiresPermissions("account:create")
public void createAccount(Account account) {
    //this method will only be invoked by a Subject
    //that is permitted to create an account
    ...
}

@RequiresRoles
當前用戶需擁有制定角色

@ RequiresUser
當前用戶需為已認證用戶或已記住用戶

3、基于JSP  TAG的授權實現(xiàn)
Shiro提供了一套JSP標簽庫來實現(xiàn)頁面級的授權控制。
在使用Shiro標簽庫前,首先需要在JSP引入shiro標簽:

復制代碼 代碼如下:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

下面一一介紹Shiro的標簽:
guest標簽
驗證當前用戶是否為“訪客”,即未認證(包含未記?。┑挠脩?

復制代碼 代碼如下:

<shiro:guest>
    Hi there!  Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today!
</shiro:guest>

user標簽
認證通過或已記住的用戶

復制代碼 代碼如下:

<shiro:user>
    Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login.
</shiro:user>

authenticated標簽
已認證通過的用戶。不包含已記住的用戶,這是與user標簽的區(qū)別所在。

復制代碼 代碼如下:

<shiro:authenticated>
    <a href="updateAccount.jsp">Update your contact information</a>.
</shiro:authenticated>

notAuthenticated標簽
未認證通過用戶,與authenticated標簽相對應。與guest標簽的區(qū)別是,該標簽包含已記住用戶。

復制代碼 代碼如下:

<shiro:notAuthenticated>
    Please <a href="login.jsp">login</a> in order to update your credit card information.
</shiro:notAuthenticated>

principal 標簽
輸出當前用戶信息,通常為登錄帳號信息

復制代碼 代碼如下:

Hello, <shiro:principal/>, how are you today?

hasRole標簽
驗證當前用戶是否屬于該角色

復制代碼 代碼如下:

<shiro:hasRole name="administrator">
    <a href="admin.jsp">Administer the system</a>
</shiro:hasRole>

lacksRole標簽
與hasRole標簽邏輯相反,當用戶不屬于該角色時驗證通過

復制代碼 代碼如下:

<shiro:lacksRole name="administrator">
    Sorry, you are not allowed to administer the system.
</shiro:lacksRole>

hasAnyRole標簽
驗證當前用戶是否屬于以下任意一個角色。

復制代碼 代碼如下:

<shiro:hasAnyRoles name="developer, project manager, administrator">
    You are either a developer, project manager, or administrator.
</shiro:lacksRole>

hasPermission標簽
驗證當前用戶是否擁有制定權限

復制代碼 代碼如下:

<shiro:hasPermission name="user:create">
    <a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>

lacksPermission標簽
與hasPermission標簽邏輯相反,當前用戶沒有制定權限時,驗證通過

復制代碼 代碼如下:

<shiro:hasPermission name="user:create">
    <a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>

三、Shiro授權的內部處理機制





1、在應用程序中調用授權驗證方法(Subject的isPermitted*或hasRole*等)
2、Sbuject的實例通常是DelegatingSubject類(或子類)的實例對象,在認證開始時,會委托應用程序設置的securityManager實例調用相應的isPermitted*或hasRole*方法。
3、接下來SecurityManager會委托內置的Authorizer的實例(默認是ModularRealmAuthorizer 類的實例,類似認證實例,它同樣支持一個或多個Realm實例認證)調用相應的授權方法。
4、每一個Realm將檢查是否實現(xiàn)了相同的 Authorizer 接口。然后,將調用Reaml自己的相應的授權驗證方法。

當使用多個Realm時,不同于認證策略處理方式,授權處理過程中:
1、當調用Realm出現(xiàn)異常時,將立即拋出異常,結束授權驗證。
2、只要有一個Realm驗證成功,那么將認為授權成功,立即返回,結束認證。 

相關文章

  • linux系統(tǒng)sudo命令詳解

    linux系統(tǒng)sudo命令詳解

    Sudo是Unix/Linux平臺上的一個非常有用的工具,它允許系統(tǒng)管理員分配給普通用戶一些合理的“權利”,讓他們執(zhí)行一些只有超級用戶或其他 特許用戶才能完成的任務
    2014-03-03
  • Linux實現(xiàn)項目的自動化部署

    Linux實現(xiàn)項目的自動化部署

    這篇文章介紹了Linux實現(xiàn)項目自動化部署的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • CentOS 5 上安裝yum的方法

    CentOS 5 上安裝yum的方法

    用過CentOS的人肯定有點不解,CentOS上自帶yum,為啥還要安裝?因為很多系統(tǒng)上并不一定安裝了yum,尤其是vps上,我給客戶的vps就經(jīng)常沒有yum,所以對于已經(jīng)依賴yum的人來說,那還得安裝一下的。
    2010-05-05
  • Linux服務器搭建nvidia-docker環(huán)境過程詳解

    Linux服務器搭建nvidia-docker環(huán)境過程詳解

    這篇文章主要介紹了Linux服務器搭建nvidia-docker環(huán)境過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 詳解Linux 主機網(wǎng)絡接入配置

    詳解Linux 主機網(wǎng)絡接入配置

    這篇文章主要介紹了詳解Linux 主機網(wǎng)絡接入配置的相關資料,希望通過本文能幫助到大家,讓大家實現(xiàn)網(wǎng)絡接入配置的功能,需要的朋友可以參考下
    2017-10-10
  • Linux重置WordPress管理員密碼的方法步驟

    Linux重置WordPress管理員密碼的方法步驟

    重置 WordPress 管理員密碼通??梢酝ㄟ^ WordPress 儀表板完成,然而,在某些情況下,例如忘記管理員密碼且無法訪問電子郵件,或網(wǎng)站崩潰無法進入儀表板時,我們可能需要通過命令行來重置,所以本文給大家介紹了Linux環(huán)境如何使用命令重置 WordPress 管理員密碼
    2024-06-06
  • jar包在linux服務器已經(jīng)運行好但是訪問不到地址的問題及解決方法

    jar包在linux服務器已經(jīng)運行好但是訪問不到地址的問題及解決方法

    這篇文章主要介紹了jar包在linux服務器已經(jīng)運行好但是訪問不到地址的問題,解決方案是需要修改防火墻開放的端口,查看防火墻開放的端口,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • linux安裝jdk,tomcat 配置vsftp遠程連接的步驟

    linux安裝jdk,tomcat 配置vsftp遠程連接的步驟

    這篇文章主要介紹了linux安裝jdk,tomcat 配置vsftp遠程連接,需要的朋友可以參考下
    2015-04-04
  • CentOS7下安裝yum源及上傳下載命令rz、sz安裝方法(圖解)

    CentOS7下安裝yum源及上傳下載命令rz、sz安裝方法(圖解)

    這篇文章主要介紹了CentOS7下安裝yum源及上傳下載命令rz、sz安裝方法,本文通過圖文并茂的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • centos8安裝zabbix提示All mirrors were tried的解決方案

    centos8安裝zabbix提示All mirrors were tried的解決方案

    這篇文章主要介紹了centos8安裝zabbix提示All mirrors were tried的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

兴义市| 郧西县| 丽水市| 晴隆县| 新竹县| 襄樊市| 武城县| 永仁县| 昭苏县| 松原市| 铁岭市| 行唐县| 加查县| 垣曲县| 赫章县| 巫山县| 宁德市| 库伦旗| 革吉县| 垫江县| 永康市| 东光县| 九龙坡区| 汨罗市| 临沭县| 台东市| 区。| 神木县| 紫阳县| 济宁市| 壶关县| 内乡县| 页游| 鄂尔多斯市| 静乐县| 桂阳县| 克东县| 宜川县| 兴国县| 黄陵县| 澳门|