总的参考文档: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有三种实现授权的方式:
- 硬编码:一般就是用if else语句实现
- 注解:在定义某个方法时,在前边加注解
- 标签:这个主要是在开发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

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

被折叠的 条评论
为什么被折叠?



