(三)shiro权限认证(授权)

权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。
在权限认证中,最核心的三个要素是:权限,角色和用户;
权限,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;
角色,是权限的集合,一中角色可以包含多种权限;

用户,在 Shiro中,代表访问系统的用户,即 Subject


编程式授权
1.1 基于角色的访问控制

封装一个shiro的util用于访问配置文件,userName和password

package com.liy.util;

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;

public class ShiroUtil {

	public static Subject login(String fileName,String userName,String password) {
		//读取配置文件,初始化SecurityManager工厂
		Factory<SecurityManager> factory = new IniSecurityManagerFactory(fileName);
		//获取SecurityManager实例
		SecurityManager securityManager=factory.getInstance();
		//把securityManager实例帮定到SecurityUtils中
		SecurityUtils.setSecurityManager(securityManager);
		//得到当前执行的用户
		Subject currentUser=SecurityUtils.getSubject();
		//创建token用户令牌
		UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
		try {
			//身份认证
			currentUser.login(token);	
			System.out.println("用户验证成功");
		} catch (AuthenticationException e) {
			e.printStackTrace();
			System.out.println("用户验证失败");
		}
		
		return currentUser;
	}
}


配置一个新的ini文件jdbc_role.ini

[users]
liy313=123456,role1,role2
jack=123,role1
role1和role2是角色,如管理员、用户等

基于角色的控制访问有三个方法:hasRole()、hasRoles()和hasAllRoles()
hasRole():如果subject有这个角色,返回true

hasRoles():接收一个list集合,依次判断是否有这些角色,并返回hasRole的数组

hasAllRoles():传入list集合,判读subject含有这些所有的角色,如果都有返回true,不是都有返回false

package com.liy.test;



import java.util.Arrays;

import org.apache.shiro.subject.Subject;

import com.liy.util.ShiroUtil;

public class Test {

	@org.junit.Test
	public void testHasRole() {
		//Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "liy313", "123456");
		Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "jack", "123");
		System.out.println(currentUser.hasRole("role2")?"有role2权限":"没有role2权限");
		
	}

	@org.junit.Test
	public void testHasRoles() {
		//Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "liy313", "123456");
		Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "jack", "123");
		//返回boolean数组
		boolean result[]=currentUser.hasRoles(Arrays.asList("role1","role2"));
		System.out.println(result[0]?"有role1权限":"没有role1权限");
		System.out.println(result[1]?"有role2权限":"没有role2权限");
	}
	
	@org.junit.Test
	public void testHasAllRole() {
		Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "liy313", "123456");
		//Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "jack", "123");
		System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2"))?"都有":"不是都有");

	}
}
liy313输出结果:

  用户验证成功
有role2权限
用户验证成功
都有
用户验证成功
有role1权限
有role2权限

jack输出结果:

  用户验证成功
没有role2权限
用户验证成功
不是都有
用户验证成功
有role1权限
没有role2权限


1.2 基于权限的访问控制 

配置文件jdbc_permission.ini

[users]
liy313=123456,role1,role2
jack=123,role1
[roles]
role1=user:select
role2=user:add,user:update,user:delete
为每个角色分配具体权限

基于权限的访问控制有两个方法:isPermitted()和isPermittedAll()

其中isPermitted()方法可以接收的参数类型:


isPermitted(String)或isPermitted(Permission):如果含有这个权限则返回true

isPermitted(List)或isPermitted(String[]):依次判断这个集合或者数组是否含有这些权限,并把这些结果存入一个boolean[]数组中。

isPermittedAll():传入list集合,判读subject含有这些所有的权限,如果都有返回true,不是都有返回false


package com.liy.test;

import org.apache.shiro.subject.Subject;
import org.junit.Test;

import com.liy.util.ShiroUtil;

public class TestPermission {

	@Test
	public void test() {
		Subject currentUser=ShiroUtil.login("classpath:jdbc_permission.ini", "liy313", "123456");
		//Subject currentUser=ShiroUtil.login("classpath:jdbc_permission.ini", "jack", "123");
		System.out.println(currentUser.isPermitted("user:select")?"有select":"没有select");
		System.out.println(currentUser.isPermitted("user:add")?"有add":"没有add");
		System.out.println(currentUser.isPermitted("user:update")?"有update":"没有update");
		System.out.println(currentUser.isPermitted("user:delete")?"有delete":"没有delete");
		
		boolean result[]=currentUser.isPermitted("user:select","user:add","user:update","user:delete");
		System.out.println(result[0]?"有select":"没有select");
		System.out.println(result[1]?"有add":"没有add");
		System.out.println(result[2]?"有update":"没有update");
		System.out.println(result[3]?"有delete":"没有delete");
		System.out.println(currentUser.isPermittedAll("user:select","user:update")?"都有":"不是都有");
	}
}


详情可以参考http://shiro.apache.org/authorization.html

猜你喜欢

转载自blog.csdn.net/a1034386099/article/details/53130354
今日推荐