授权:操作系统资源的权限(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);
	}
}

工程结构:

codesys授权文件 somove授权代码_codesys授权文件

测试结果:

认证结果:true
--------------------------------
授权结果:
是否拥有role1角色:true
是否拥有role10角色:false
是否拥有user:create权限:true
是否拥有user:add权限:false
是否拥有user:create:001(新增001用户)的权限:true