授权:操作系统资源的权限(who对what进行how操作)
Shiro 支持三种方式的授权:
1、编程式:通过写if/else 授权代码块完成:
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
}
2、注解式:通过在执行的Java方法上放置相应的注解完成:
@RequiresRoles("admin")
public void hello() {
//有权限
}
3、JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:
<shiro:hasRole name="admin">
<!— 有权限—>
</shiro:hasRole>
本教程序授权测试使用第一种编程方式,实际与web系统集成使用后两种方式。【第一种的配置比较繁琐,也不实际】
权限字符串的规则:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。
例子:
用户创建权限:user:create,或user:create:*
用户修改实例001的权限:user:update:001
用户实例001的所有权限:user:*:001
-------------------------------------------------------------------------
一、创建shiro-permission.ini【这个文件相当于数据库】
# 【用户】
[users]
# 用户zhang的密码是123,此用户具有role1和role2两个角色
zhang=123,role1,role2
wang=123,role2
# 【角色】
[roles]
# 角色role1对资源user拥有create、update权限
role1=user:create,user:update
# 角色role2对资源user拥有create、delete权限
role2=user:create,user:delete
# 角色role3对资源user拥有create权限
role3=user:create
二、测试代码
AuthorizationTest.java
package cn.itcast.shiro.authorization;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;
// 授权测试
public class AuthorizationTest {
// 角色、权限授权
@Test
public void testAuthorization() {
// 准备工作
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
// 先认证通过后才能进行授权操作
UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
try {
subject.login(token);
} catch (AuthenticationException e) {
e.printStackTrace();
}
System.out.println("认证结果:" + subject.isAuthenticated());
System.out.println("--------------------------------");
System.out.println("授权结果:");
// 授权
// 1.基于角色的授权,除了下面的方法,还有其他方法,比如hasAllRoles()等等,具体查看文档
boolean hasRole_role1 = subject.hasRole("role1");
System.out.println("是否拥有role1角色:" + hasRole_role1);
boolean hasRole_role10 = subject.hasRole("role10");
System.out.println("是否拥有role10角色:" + hasRole_role10);
// 2.基于资源的授权,除了下面的方法,还有其他方法,具体查看文档
boolean permitted_Usercreate = subject.isPermitted("user:create");
boolean permitted_UserAdd = subject.isPermitted("user:add");
System.out.println("是否拥有user:create权限:" + permitted_Usercreate);
System.out.println("是否拥有user:add权限:" + permitted_UserAdd);
// 具体资源,如果拥有user:create角色,就代表拥有user:create:*的角色
boolean permitted_001 = subject.isPermitted("user:create:001");
System.out.println("是否拥有user:create:001(新增001用户)的权限:" + permitted_001);
}
}
工程结构:
测试结果:
认证结果:true
--------------------------------
授权结果:
是否拥有role1角色:true
是否拥有role10角色:false
是否拥有user:create权限:true
是否拥有user:add权限:false
是否拥有user:create:001(新增001用户)的权限:true