10 Shrio Permission

简介: 10 Shrio Permission

字符串通配符权限

规则:“资源标识符:操作:对象实例ID”即对哪个资源的哪个实例可以进行什么操作。其默认支持通配符权限字符串,“:”表示资源/操作/实例的分割;“,”表示操作的分割;“*”表示任意资源/操作/实例。

1、单个资源单个权限
subject().checkPermissions("system:user:update");

用户拥有资源“system:user”的“update”权限。

2、单个资源多个权限

ini配置文件

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权限)

role42="system:user:update,delete"

接着可以通过如下代码判断

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

通过“system:user:update,delete”验证"system:user:update, system:user:delete"是没问题的,但是反过来是规则不成立。

3、单个资源全部权限

ini配置

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

然后通过如下代码判断

subject().checkPermissions("system:user:create,delete,update: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配置

role61=*:view

然后通过如下代码判断

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

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

5、实例级别的权限
5.1、单个实例单个权限

ini配置

role71=user:view:1

对资源user的1实例拥有view权限。

然后通过如下代码判断

subject().checkPermissions("user:view:1");
5.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");
5.3、单个实例所有权限

ini配置

role73=user:*:1

对资源user的1实例拥有所有权限。

然后通过如下代码判断

subject().checkPermissions("user:update:1", "user:delete:1", "user:view:1");
5.4、所有实例单个权限

ini配置

role74=user:auth:*

对资源user的1实例拥有所有权限。

然后通过如下代码判断

subject().checkPermissions("user:auth:1", "user:auth:2");
5.5、所有实例所有权限

ini配置

role75=user:*:*

对资源user的1实例拥有所有权限。

然后通过如下代码判断

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

如下两种方式是等价的:

subject().checkPermission("menu:view:1");  
subject().checkPermission(new WildcardPermission("menu:view:1"));

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

8、性能问题

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

目录
相关文章
|
API 数据安全/隐私保护
06 Shrio Authenticator及AuthenticationStrategy
06 Shrio Authenticator及AuthenticationStrategy
43 1
|
SQL 安全 测试技术
05 Shrio Realm
05 Shrio Realm
45 0
|
前端开发 安全 Java
SpringSecurity权限控制和注销
SpringSecurity权限控制和注销
使用JdbcRealm时,UnauthorizedException: Subject does not have permission
使用JdbcRealm时,UnauthorizedException: Subject does not have permission
|
安全 Java 关系型数据库
|
监控 Android开发 缓存
uses-permission权限列表
android.permission.ACCESS_CHECKIN_PROPERTIES允许读写访问”properties”表在checkin数据库中,改值可以修改上传 android.permission.
974 0
|
安全 Java 数据库
SpringSecurity权限命名ROLE_问题
SpringSecurity权限命名ROLE_问题
212 0
SpringSecurity权限命名ROLE_问题
|
Android开发
【错误记录】前台进程报错 ( Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE )
【错误记录】前台进程报错 ( Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE )
604 0
【错误记录】前台进程报错 ( Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE )
|
安全 Android开发
uses-permission和permission区别及使用
uses-permission和permission的区别 permission定义权限 uses-permission申请权限 uses-permission(权限申请) 介绍 添加自定义权限,如: 官方权限大全 站内权限大全 permission(自定义权限) 介绍 permission样例 1.先使用定义一个权限 2.provider组件设置权限 3.其他应用(com.scc.ha)使用com.scc.cp包加权限的UserProvider permission官方文档 permission-group(自定义权限组) 介绍 permission-group样例
356 0
|
.NET API Apache
[认证授权] 6.Permission Based Access Control
在前面5篇博客中介绍了OAuth2和OIDC(OpenId Connect),其作用是授权和认证。那么当我们得到OAuth2的Access Token或者OIDC的Id Token之后,我们的资源服务如何来验证这些token是否有权限来执行对资源的某一项操作呢?比如我有一个API,/books,它具...
1287 0