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 查询时加上权限字符串之类的方式在查询时就完成了权限匹配。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值