Apache Shiro授权、访问控制(四)

Apache Shiro授权机制包括Permissions、Roles和Users三个核心概念。Permissions代表具体权限,Roles是一组Permissions集合,Users通过Role获取权限。授权实现包括硬编码、注解和标签库。硬编码分为Role-Based和Permission-Based授权,注解如RequiresAuthentication、RequiresPermissions等简化授权。此外,Shiro的授权流程涉及ModularRealmAuthorizer,支持多Realm协调。

总的参考文档:http://shiro.apache.org/reference.html
本文参考文档:http://shiro.apache.org/authorization.html

1、概念

Shiro授权机制包含三个核心概念:Permissions、Roles、Users。

1.1.Permissions

Permissions代表权限,关涉及用户。它一般是一种语句,表示对什么东西可以做什么事情。Shiro中的权限一般这样子定义:
PermissionDefine1=file:view    这个表示可以查看文件。或者:
PermissionDefine2="table:view,modify"   表示可以查看、修改表。或者更细粒度的控制:
PermissionDefine3="user:view,modify,delete:billy" 表示可以查看、修改、删除名为billy的用户。
关于Shiro中Permission的定义,前文说过了,详细参考:http://shiro.apache.org/permissions.html

1.2.Roles

Role就是角色,它是一组Permission的集合,一个Role可以有多个权限,如:
Role1=PermissionDefine1,PermissionDefine2,PermissionDefine1
上边的这种定义方,等号前边是名称后边是权限,这叫显式Role。

还有一种叫隐式Role,示例如下:
FileViewRole
TableViewModifyRole
这种定义,只有Role名称没有为这种Role赋予权限定义,Role的权限隐藏在Role的名称中。在具体的应用中,要根据Role的名称决定拥有这种Role的用户的权限,所以叫隐式。
Shiro同时支持这两种方式,但一般我们都用显示。

1.3.Users

定义好Permission,然后通过各种Role将它们组织起来,最后再将Role赋予不同的用户,那么用户最终就是相应的权限了。Shiro中为用户指定Role的格式如下:
user1=password,Role1,Role2

最后需要说明的是,以上关于Permission、Role、Users的示例只是具体实现的一种。在实际中Permission如何定义、Role如何定义、User如何定义可以是任何形式,数据可以保存在任何地方,Shiro对此没有任何限制。但是,开发者需要实现自己的Realm接口,将这种细节隐藏起来就可以了。

2、授权的实现

在实际的开发中,Shiro有三种实现授权的方式:

  1. 硬编码:一般就是用if else语句实现
  2. 注解:在定义某个方法时,在前边加注解
  3. 标签:这个主要是在开发JSP时使用

下边详细说明这三种方式。

2.1.硬编码

硬编码也分成几种。

2.1.1.Role-Based-Authorization

基于角色的授权。示例代码如下:

Subject currentUser = SecurityUtils.getSubject();

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

上例中,首先取得Subject,Subject代表一个User。我们看到这个User并没有输入用户名、密码什么的执行login操作。前边说过了,Subject实例是与线程绑定的,这个时候它应该在线程其它地方login过了,身份是明确的。

以上代码很简单,通过if else语句判断当前Subject是否被指派了某个角色,如果指定了就执行相应的操作,否则不执行。
hasRole()方法是检查角色的一种,还有其它方法可以使用:

Subject Method Description
hasRole(String roleName) 只有Subject有参考指定的角色就返回true,否则返回false。
hasRoles(List<String> roleNames) 在参数中传入Role名称的数组,返回值也是一个代表是否有这些Role的数组。这个就相当于调用了多次hasRole方法,并把各个hasRole的返回值打包成数据再返回,起到简化代码的作用。
hasAllRoles(Collection<String> roleNames) 如果当前Subject拥有参数中指定的全部Role返回true,否则返回false。

还有一种替代方式,称为断言方式。在上边的hasRole、hasRoles、hasAllRoles方法中,方法会返回true或者false。断言不一样,不它不返boolean值,如果授权没有通过它抛出异常,否则不抛出异常,就这点区别,示例如下:

Subject curr
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值