使用Apache Shiro进行授权说明

授权或叫访问控制是对资源指定访问权限的功能。简单而言就是谁能够访问什么。在授权领域有三个关键元素——permissions, roles, and users——在shiro中我们经常会引用。

Permissions(权限)是安全策略中最原子级别的概念,并且他们够不语句表达。权限代表在我们的系统中可以做什么。良好的权限形式描述了资源类型以及拥有它的操作者能够对这些资源做什么。比如是否可以下载文档、是否能够看到按钮等等。此处一定要理解到权限仅仅表达了什么样的动作可以执行,而并没有说谁能够做这些动作。

对于数据相关的资源,其基本操作包括创建(create)、读取(read)、更新(update)和删除(delete),其实就是众多系统开发者都熟悉的CRUD。

上面的权限仅仅描述了资源类型的级别,如可以看到按钮的权限描述,并没有描述这个资源的实例是什么,我们可以这样再来描述下:可以看到编辑按钮。其实在shiro中我们可以定义任意深度的权限。下面列列举三种权限级别#

资源级别(Resource level)——这是一种很宽广和容易构建的权限,就像上面的例子一样。

资源实例级别(instance level)——这种权限指定了权限的实例(具体资源——根据定义的深度不同不同,例如“门”是资源,它的实例可以是厨房门,但这可以再往深处定义我家厨房门)。

属性级别(attribute level)——这里指定了一个具体资源或者资源类型的属性级别的权限。

角色(Roles):在授权范围内,角色是一种有效的用于简化管理权限(permissions)和用户(users)的权限集合。Shiro支持两种角色类型——暗含的角色(Implicit Roles)和明确的角色(explicit
Roles)。

什么是暗含的角色呢?可以简单的理解为在应用中实际上为真正定义或剥离这种角色,而仅仅是混杂在代码中,且往往这种角色直接和资源相关联。例如一个系统中通过判断用户是档案馆管理员员(这就是一种暗含角色)则可以查阅渤海油田档案,其实诸如“档案馆工作人员”等名字(暗含角色)的存和系统中档案查阅功能模块所做的事情没有相关性。这种使用角色的习惯对简单的系统无所谓,但略复杂的系统则会带来许多维护和管理的问题。

什么又是明确的角色呢?它是指被明确指定了权限的角色,即这种角色是一种明确的权限集合。例如一个系统用户之所以能够查阅渤海油田档案是因为它所属的档案馆管理员角色拥有档案查阅权限,而不单单是因为他是管理员,即便他是普通职工,只要具备档案查阅权限,则其即可查阅档案。

Users:在shiro中Users就是subject的实例,不单单指自然人,也可以是软件服务等。一个用户能够执行系统中某些操作是因为它的关联的角

色或者直接拥有的权限。

在了解了授权的基础知识后,我要清楚java环境下如何使用shiro检测已授权限。shiro中可以使用三种方式来授权:直接编码、在java方法上使用注解、在jsp中使用taglib以控制表单的输出。

直接编写代码方式下我们即可来检测用户是否具备有个角色,也可以来检测是否具备某种权限。检测角色使用Subject的hasRole()方法,但这种方式如果后续涉及到角色的增加、删除等操作就不得不找到源码进行修改,不建议使用。示例如下所示。


//get the current Subject

Subject currentUser =

    SecurityUtils.getSubject();

 

if (currentUser.hasRole(“administrator”)) {

    //show a special button?

} else {

    //don’t show the button?)?

}

在代码中检测权限有两种方式,一种是基于Permission对象的检测,一种是基于字符串的检测方式。这种检测使用的是Subject的isPermitted()方法。示例代码如下所示。


Subject currentUser = SecurityUtils.getSubject();

 

Permission printPermission = 

new PrinterPermission(“laserjet3000n”,“print”);

 

If (currentUser.isPermitted(printPermission)) {

    //do one thing (show the print button?)?

} else {

    //don’t show the button?

}

String perm = “printer:print:laserjet4400n”;

 

if(currentUser.isPermitted(perm)){

    //show the print button?

} else {

    //don’t show the button?

}

上文中字符串的方式采用的是shiro的WildCardPermissions格式。这种字符串通配符权限表达方式的格式为:” 资源:操作:资源实例"。具体可以参考:http://shiro.apache.org/permissions.html

使用注解方式可以在方法级别上阻止不具备相应权限的用户访问此方法,这也存在两种方式,一种是检测权限,一种是检测较色。示例代码如下所示。


//Will throw an AuthorizationException if none

//of the caller’s roles imply the Account 

//‘create‘ permission?

@RequiresPermissions(“account:create”)?

public void openAccount( Account acct ) { 

    //create the account

}

//Throws an AuthorizationException if the caller

//doesn’t have the ‘teller’ role:

 

@RequiresRoles( “teller” )

public void openAccount( Account acct ) { 

    //do something in here that only a teller

    //should do

}

最后一种是taglib方式。在jsp中引入shiro的tag,之后使用<shiro:hasPermission>来判断是否具备某种权限,使用<shiro:lacksPermission>来判断不具备有种权限时表单的显示。除此外还有许多其他tag可以使用,此处仅以这两种为例如下所示。


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

<html>

<body>

    <shiro:hasPermission name=“users:manage”>

        <a href=“manageUsers.jsp”>

            Click here to manage users

        </a>

    </shiro:hasPermission>

    <shiro:lacksPermission name=“users:manage”>

        No user management for you!

    </shiro:lacksPermission>

</body>

</html>
时间: 2024-12-15 04:21:48

使用Apache Shiro进行授权说明的相关文章

Apache Shiro 认证+授权(一)

1.核心依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> 2.认证流程:创建SecurityManager-->主体提交认证-->SecurityMananger认证-->Authentict

Apache Shiro学习----授权

Shiro支持三种方式的授权: 1.编程式:通过写if/else授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(subject.hasRole("admin")) { //有权限 } else { //无权限 } 2.注解式:通过在执行的Java方法上放置相应的注解完成: @RequiresRoles("admin") public void hello() { //有权限 } 3.JSP/GSP标

SpringMVC+Apache Shiro+JPA(hibernate)案例教学(四)基于Shiro验证用户权限,且给用户授权

最新项目比较忙,写文章的精力就相对减少了,但看到邮箱里的几个催更,还是厚颜把剩下的文档补上. 一.修改ShiroDbRealm类,实现它的doGetAuthorizationInfo方法 package org.shiro.demo.service.realm; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.apache.commons.lang.St

Apache Shiro 使用手册(三)Shiro 授权

授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等. 一.授权的三要素 授权有着三个核心元素:权限.角色和用户. 权限 权限是Apache Shiro安全机制最核心的元素.它在应用程序中明确声明了被允许的行为和表现.一个格式良好的权限声明可以清晰表达出用户对该资源拥有的权限. 大多数的资源会支持典型的CRUD操作(create.read.update.delete),但是任何操作

Apache Shiro学习笔记(三)用户授权自定义Permission

鲁春利的工作笔记,好记性不如烂笔头 Shiro配置文件(shiro-customize-permission.ini) [main] myRealmA=com.invicme.apps.shiro.permission.MyRealmOne myPermissionResolver=com.invicme.apps.shiro.permission.MyPermissionResolver securityManager.authorizer.permissionResolver = $myPe

Apache Shiro 认证、授权、加密和会话管理

官方解释 : Apache Shiro(日语"堡垒(Castle)"的意思)是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理功能,可为任何应用提供安全保障 - 从命令行应用.移动应用到大型网络及企业应用. Shiro为解决下列问题(我喜欢称它们为应用安全的四要素)提供了保护应用的API: 认证 - 用户身份识别,常被称为用户"登录": 授权 - 访问控制: 密码加密 - 保护或隐藏数据防止被偷窥: 会话管理 - 每用户相关的时间敏感的状态. Shi

Apache Shiro学习笔记(三)用户授权

鲁春利的工作笔记,好记性不如烂笔头 Shiro默认提供的Realm 认证(Authentication)用来证明用户身份是合法的:而授权(Authorize)用来控制合法用户能够做什么(能访问哪些资源). 实际系统应用中一般继承AuthorizingRealm(授权)即可:其继承了AuthenticatingRealm(即身份验证),而且也间接继承了CachingRealm(带有缓存实现). 在授权中需了解的几个关键对象:主体(Subject).资源(Resource).权限(Permissio

Apache shiro集群实现 (四)shiro授权(Authentication)--访问控制

授权(Authorization)也叫做访问控制,是一个对资源的访问进行管理的过程,也就是说在应用程序汇总,谁有怎样的权限(用户可以看到什么内容,可以进行什么操作).        在ITOO项目中,首先是考虑基于角色的授权,当用户的角色发生变化的时候,不灵活,所以为了更好的结合项目的实际情况,是采用的通过字符串的方式的权限验证:当然针对后台的方法的可以采用注解式的权限控制(可以用户类/属性/方法,用于表明当前用户需是经过认证的用户). 授权的三要素 权限       权限是shiro权限系统中

(转) Apache Shiro 使用手册(三)Shiro 授权

解惑之处: 使用冒号分隔的权限表达式是org.apache.shiro.authz.permission.WildcardPermission 默认支持的实现方式. 这里分别代表了 资源类型:操作:资源ID 类似基于对象的实现相关方法,基于字符串的实现相关方法: isPermitted(String perm).isPermitted(String... perms).isPermittedAll(String... perms) 以下两种方案是等价的: subject().checkPermi