shiro之授权 Permission

Posted Firm陈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro之授权 Permission相关的知识,希望对你有一定的参考价值。

字符串通配符权限
规则:“资源标识符:操作:对象实例ID” 即对哪个资源的哪个实例可以进行什么操作。

其默认支持通配符权限字符串,“:”表示资源/操作/实例的分割;“,”表示操作的分割;“*”表示任意资源/操作/实例。

1. 单个资源单个权限

subject().checkPermissions("system:user:update");

用户拥有资源"system:user"的"update"权限

2. 单个资源多个权限
ini配置文件

[users]
zhang=123,role1,role2,role41
wang=123,role1
[roles]
role1=system:user:create,system:user:update
role2=system:user:create,system:user:delete
role41=system:user:update,system:user:delete

通过如下代码判断:

subject.checkPermissions("system:user:update","system:user:delete");

用户拥有资源“system:user”的“update”和“delete”权限。如上可以简写成:ini配置(表示角色4 拥有system:user资源的update和delete 权限)

role41="system:user:update,delete"

通过如下代码判断

subject.checkPermissions("system:user:update,delete");

或者

subject.checkPermissions("system:user:update,delete");

3. 单个资源全部权限
ini配置

role41="system:user:create,update,delete,view"

然后通过如下代码判断

@Test
public void testCheckPermission(){
	login("classpath:shiro-permission2.ini","zhang","123");
	Subject subject = SecurityUtils.getSubject();
	subject.checkPermissions("system:user:create,update,delete,view");
}

用户拥有资源"system.user"的"create"、“update”、"delete"和"view"的所有权限。
如上可以简写成:
ini配置文件(表示角色5拥有system:user的所有权限)

role52=system:user:*

也可以简写为(推荐上边的写法):

role53=system:user

然后通过如下代码判断

subject().checkPermissions("system:user:*");
subject().checkPermissions("system:user");

通过“system:user:*”验证“system:user:create,delete,update:view”可以,但是反过来是不成立的。

4. 所有资源全部权限
ini配置
role6=*:view

然后通过如下代码判断

subject().checkPermissions("user:view");

用户拥有所有资源的“view”所有权限。假设判断的权限是“"system:user:view”,那么需要“role5=::view”这样写才行。

5. 实例级别的权限
(1)单个实例的单个权限
ini配置

role71=user:view:1

对资源user的1实例拥有view权限
然后通过如下代码判断

subject().checkPermissions("user:view:1");

(2)单个实例多个权限
ini配置

role72="user:update,delete:1"

对资源user的1 实例拥有update、delete权限。
然后通过如下代码判断

subject().checkPermissions("user:delete,update:1");

subject().checkPermissions("user:update:1", "user:delete:1");

(3)单个实例所有权限
ini配置

role73=user:*:1

对资源user的1 实例拥有所有权限。
然后通过如下代码判断

subject().checkPermissions("user:update:1", "user:delete:1", "user:view:1");

(4)所有实例所有权限
ini配置

role74=user:auth:*

对资源user的所有 实例拥有auth权限。
然后通过如下代码判断

subject().checkPermissions("user:auth:1", "user:auth:2");

(5)所有实例所有权限
ini配置

role75=user:*:*

对资源user的所有实例拥有所有权限。
然后通过如下代码判断

subject().checkPermissions("user:view:1", "user:auth:2");

6.Shiro对权限字符串缺失部分的处理

如“user:view”等价于“user:view:*”;

而“organization”等价于“organization:*”或者“organization:*:*”。

可以这么理解,这种方式实现了前缀匹配。

另外如

“user:*”可以匹配如“user:delete”、

“user:delete”可以匹配如“user:delete:1”、

“user:*:1”可以匹配如“user:view:1”、

“user”可以匹配“user:view”或“user:view:1”等。

即*可以匹配所有,不加*可以进行前缀匹配;
但是如“*:view”不能匹配“system:user:view”,需要使用“*:*:view”,即后缀匹配必须指定前缀(多个冒号就需要多个*来匹配)。

7.WildcardPermission
如下两种方式是等价的:

@Test
public void testCheckPermission(){
	login("classpath:shiro-permission2.ini","zhang","123");
	Subject subject = SecurityUtils.getSubject();
	subject.checkPermissions("system:user:view");
	subject.checkPermission(new WildcardPermission("system:user:view"));
}

因此没什么必要的话使用字符串更方便。

8.性能问题
通配符匹配方式比字符串相等匹配来说是更复杂的,因此需要花费更长时间,但是一般系统的权限不会太多,且可以配合缓存来提供其性能,如果这样性能还达不到要求我们可以实现位操作算法实现性能更好的权限匹配。另外实例级别的权限验证如果数据量太大也不建议使用,可能造成查询权限及匹配变慢。可以考虑比如在sql 查询时加上权限字符串之类的方式在查询时就完成了权限匹配。

以上是关于shiro之授权 Permission的主要内容,如果未能解决你的问题,请参考以下文章

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

shiro授权

Shiro授权管理

基于shiro授权过程

shiro授权

Shiro学习授权