Java基础、中级、高级、架构面试资料

Shiro 授权 checkPermissions

JAVA herman 3834浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

在上一章《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

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » Shiro 授权 checkPermissions