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

来源:互联网 发布:宏观经济信息数据库 编辑:程序博客网 时间:2024/06/05 02:28
权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。
在权限认证中,最核心的三个要素是:权限,角色和用户;
权限,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;
角色,是权限的集合,一中角色可以包含多种权限;

用户,在 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,role2jack=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.Testpublic 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.Testpublic 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.Testpublic 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,role2jack=123,role1[roles]role1=user:selectrole2=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 {@Testpublic 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

0 0
原创粉丝点击