在上一章《Shiro 基于角色的访问控制和基于资源的访问控制》我们学习了Shiro 授权的三种方式:编程式、注解式、JSP/GSP标签。接下来我们将继续学习Shiro的授权和它授权的流程。
字符串通配符权限
规则:“资源标识符:操作:对象实例ID” 即对哪个资源的哪个实例可以进行什么操作。其默认支持通配符权限字符串,“:”表示资源/操作/实例的分割;“,”表示操作的分割;“*”表示任意资源/操作/实例。
单个资源单个权限
用户拥有资源“system:user”的“update”权限。
subject().checkPermissions("system:user:update");
单个资源多个权限
ini配置文件
role41=system:user:update,system:user:delete
用户拥有资源“system:user”的“update”和“delete”权限。java 授权代码如下:
subject().checkPermissions("system:user:update", "system:user:delete");
ini配置(表示角色4拥有system:user资源的update和delete权限)
role42="system:user:update,delete"
通过“system:user:update,delete”验证"system:user:update, system:user:delete"是没问题的,但是反过来是规则不成立。
subject().checkPermissions("system:user:update,delete");
单个资源全部权限
role51="system:user:create,update,delete,view" //用户拥有资源“system:user”的“create”、“update”、“delete”和“view”所有权限 subject().checkPermissions("system:user:create,delete,update:view"); //角色52拥有system:user的所有权限 role52=system:user:* //或者简写为; role53=system:user subject().checkPermissions("system:user:*"); subject().checkPermissions("system:user");
通过“system:user:*”验证“system:user:create,delete,update:view”可以,但是反过来是不成立的。
所有资源全部权限
role61=*:view subject().checkPermissions("user:view");
用户拥有所有资源的“view”所有权限。假设判断的权限是“"system:user:view”,那么需要“role5=*:*:view”这样写才行。
单个实例单个权限
//对资源user的1实例拥有view权限 role71=user:view:1 subject().checkPermissions("user:view:1");
单个实例多个权限
//对资源user的1实例拥有update、delete权限 role72="user:update,delete:1" subject().checkPermissions("user:delete,update:1"); subject().checkPermissions("user:update:1", "user:delete:1");
单个实例所有权限
//对资源user的1实例拥有所有权限。 role73=user:*:1 subject().checkPermissions("user:update:1", "user:delete:1", "user:view:1");
所有实例单个权限
//对资源user的1实例拥有所有权限。 role74=user:auth:* subject().checkPermissions("user:auth:1", "user:auth:2");
所有实例所有权限
//对资源user的1实例拥有所有权限。 role75=user:*:* subject().checkPermissions("user:view:1", "user:auth:2");
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”,即后缀匹配必须指定前缀(多个冒号就需要多个*来匹配)。
WildcardPermission 的使用
subject().checkPermission("menu:view:1"); subject().checkPermission(new WildcardPermission("menu:view:1"));
Shiro 授权性能问题
通配符匹配方式比字符串相等匹配来说是更复杂的,因此需要花费更长时间,但是一般系统的权限不会太多,且可以配合缓存来提供其性能,如果这样性能还达不到要求我们可以实现位操作算法实现性能更好的权限匹配。另外实例级别的权限验证如果数据量太大也不建议使用,可能造成查询权限及匹配变慢。可以考虑比如在sql查询时加上权限字符串之类的方式在查询时就完成了权限匹配。
相关代码下载链接:http://pan.baidu.com/s/1pKPAR1L 密码:kbj8
: » Shiro 授权 checkPermissions
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/251543.html