博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Shiro:学习笔记(2)——授权
阅读量:4881 次
发布时间:2019-06-11

本文共 2832 字,大约阅读时间需要 9 分钟。

Shiro:学习笔记(2)——授权

Shiro的三种授权方式

编程式:

Subject subject = SecurityUtils.getSubject();  if(subject.hasRole(“admin”)) {      //有权限  } else {      //无权限  }

注解式:

@RequiresRoles("admin")  public void hello() {      //有权限  }

说明:没有权限将抛出相应的异常

JSP标签:

基于角色的访问控制

1.在ini中配置用户所拥有的角色

[users]zhang=123,role1,role2wang=123,role

  规则:用户名=密码,角色1,角色2

  说明:Shiro不负责维护用户-角色信息,需要应用提供,Shiro只提供相应的接口方便验证。

2.测试用例  

  

3.缺点:

  如果有一天摒弃了某个角色,就需要把所有相关的地方进行删除。

基于资源的访问控制

 1.在ini中配置用户所拥有的角色及角色-权限关系

[users]zhang=123,role1,role2wang=132,role1[roles]role1=user:create,user:updaterole2=user:create,user:delete

2.测试用例

  

字符串通配符权限

1、单个资源单个权限 

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

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

2.单个资源多个权限

  role41=system:user:update,system:user:delete 

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

用户拥有资源“system:user”的“update”和“delete”权限。如上可以简写成:

  role42="system:user:update,delete"   //注意引号

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

3.单个资源全部权限

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

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

用户拥有资源“system:user”的“create”、“update”、“delete”和“view”所有权限。如上可以简写成:

    role52=system:user:*  

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

    role53=system:user  

然后通过如下代码判断

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

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

4、所有资源全部权限

  1. role61=*:view  

然后通过如下代码判断

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

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

 

5、实例级别的权限

5.1、单个实例单个权限

  1. role71=user:view:1  

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

然后通过如下代码判断 

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

5.2、单个实例多个权限

  1. role72="user:update,delete:1"  

对资源user的1实例拥有update、delete权限。

然后通过如下代码判断

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

5.3、单个实例所有权限

  1. role73=user:*:1  

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

然后通过如下代码判断 

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

5.4、所有实例单个权限

  1. role74=user:auth:*  

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

然后通过如下代码判断 

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

5.5、所有实例所有权限

  1. role75=user:*:*  

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

然后通过如下代码判断     

  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"));

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

转载于:https://www.cnblogs.com/MrSaver/p/7512373.html

你可能感兴趣的文章
Java工程师成神之路
查看>>
线程池ThreadPoolExecutor整理
查看>>
如何将离线的PIP安装包快速安装好
查看>>
应对通过代理攻击服务器的方法
查看>>
TIPSO--基于JQUERY的消息提示框插件,用起来蛮顺手
查看>>
散列表(哈希表)
查看>>
Linux基础命令---显示域名ypdomainname
查看>>
Rails学习笔记(1)-Ubuntu12.04下的环境配置
查看>>
LeetCode - Remove Duplicates from Sorted Array
查看>>
object.__getattr__(self, name) 、object.__setattr__(self, name, value)
查看>>
环境光
查看>>
ExtJS基础篇
查看>>
Javassist字节码强化
查看>>
把普通函数指针,变成对象方法指针
查看>>
jax-ws开发接口传参数
查看>>
IIS 6.0、IIS 7.0/ 7.5 配置HTTP压缩的步骤
查看>>
【JZOJ4934】【NOIP2017GDKOI模拟1.12】a
查看>>
猎豹MFC--GDI+
查看>>
EOJ 1113 装箱问题
查看>>
singleton模式的三种模板实现
查看>>