权限认证:
1、权限认证核心要素
权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。在权限认证中,最核心的三个要素是:权限,角色和用户。权限:即操作资源的权利,比如访问某个页面,以及某个模块的数据的添加,修改 ,删除,查看的权利;角色:是权限的集合,一个角色可以包含多个权限用户:在shiro中,代表访问系统的用户,即Subject
2、授权
1)编程式授权a)基于角色的访问控制b)基于权限的访问控制2)注解式授权3)Jsp标签授权
由于测试的方法多,这里我们需要引入单元测试Junit,同样在pom.xml中加入Junit的依赖jar包。
封装我们的shiro登录,做一个ShiroUtil,方便我们调用。
package com.feiyang.util;
import org.apache.shiro.SecurityUtils;
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 ShiroUitl {
public static Subject login(String configFile, String userName, String password) {
// 读取配置文件,初始化SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile);
// 获取securityManager实例
SecurityManager securityManager = factory.getInstance();
// 把securityManager实例绑定到SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
// 得到当前执行的用户
Subject subject = SecurityUtils.getSubject();
// 创建token令牌,用户名/密码
UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
try{
//身份验证
subject.login(token);
System.out.println("身份登录成功 ");
}catch(Exception e){
e.printStackTrace();
System.out.println("身份登录成失败");
}
return subject;
}
}
一、基于角色的身份判断
准备配置文件,shiro_role.ini,用于描述用户的登录信息以及角色信息。
准备配置文件,shiro_role.ini,用于描述用户的登录信息以及角色信息。
然后创建junt Test Cas,进行测试:
package com.feiyang.shiro;
import java.util.Arrays;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
import com.feiyang.util.ShiroUitl;
public class RoleTest {
@Test
public void testHasRole() {
System.out.println("---------判断是否有role1角色------------");
Subject subject =ShiroUitl.login("classpath:shiro_role.ini", "feiyang", "123456");
boolean hasRole = subject.hasRole("role1");
System.out.println(hasRole?"有role1角色":"没有role1角色");
System.out.println("---------判断是否有role1,role2,role3角色------------");
boolean[] hasRoles = subject.hasRoles(Arrays.asList("role1","role2","role3"));
System.out.println(hasRoles[0]?"有role1角色":"没有role1角色");
System.out.println(hasRoles[1]?"有role2角色":"没有role2角色");
System.out.println(hasRoles[2]?"有role3角色":"没有role3角色");
subject.hasRoles(Arrays.asList("role1","role2","role3"));
System.out.println("---------判断是否拥有role1,role2,role3三个权限------------");
System.out.println(subject.hasAllRoles(Arrays.asList("role1","role2","role3"))?"具备role1,role2,roel3三个角色":"不具备role1,role2,roel3三个角色");
}
}
二、基于权限的身份判断
准备配置文件,shiro_permissopn.ini,用于描述用户的登录信息以及角色和权限信息。
然后创建junt Test Cas,进行测试:
package com.feiyang.shiro;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
import com.feiyang.util.ShiroUitl;
public class PermissionTest {
@Test
public void testPermitted() {
Subject subject = ShiroUitl.login("classpath:shiro_permission.ini","feiyang", "123456");
//单个权限的判断
System.out.println(subject.isPermitted("user:select")?"有user:select权限":"没有user:select权限");
System.out.println(subject.isPermitted("user:delete")?"有user:delete权限":"没有user:delete权限");
//多个权限的判断
subject.isPermitted("user:delete","user:select");
//全部权限的判断
}
@Test
public void testPermitted2() {
//多个权限的判断
Subject subject = ShiroUitl.login("classpath:shiro_permission.ini","jack", "1234");
boolean[] permitted = subject.isPermitted("user:delete","user:select");
System.out.println(permitted[0]?"有user:delete权限":"没有user:delete权限");
System.out.println(permitted[1]?"有user:select权限":"没有user:select权限");
} @Test
public void testPermitted3() {
//全部权限的判断
Subject subject = ShiroUitl.login("classpath:shiro_permission.ini","feiyang", "123456");
System.out.println(subject.isPermittedAll("user:select","user:delete","user:add")?
"user:select,user:delete,user:add三个权限都有":"ser:select,user:delete,user:add三个权限不都有");
}
}
测试结果,大家自己运行下就好了。