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

本文介绍了Shiro中的三种授权方式:编程式、注解式和JSP标签式,并详细阐述了基于角色和基于资源的访问控制策略,包括字符串通配符权限的使用方法。

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

Shiro的三种授权方式

编程式:

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

注解式:

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

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

JSP标签:

<shiro:hasRole name="admin">  
<!— 有权限 —>  
</shiro:hasRole>   

基于角色的访问控制

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

[users]
zhang=123,role1,role2
wang=123,role

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

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

2.测试用例  

  

3.缺点:

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

基于资源的访问控制

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

[users]
zhang=123,role1,role2
wang=132,role1
[roles]
role1=user:create,user:update
role2=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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值