您的位置:首页 > 其它

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

2016-12-22 16:12 295 查看
权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。

在权限认证中,最核心的三个要素是:权限,角色和用户;

权限,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;

角色,是权限的集合,一中角色可以包含多种权限;

用户,在 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: