Shiro学习笔记 三(认证授权)
第一种首先基于角色的权限控制
1.由于不断的创建SecurityFactory工程等步骤重复多次,所以应该将这些步骤封装成一个工具类
还是首先看一下目录结构
主要用到文件
首先贴一下工具类的方法
package com.zuoyan.utils; 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; /** * 将获取当前用户封装成一个方法,方便每次调用 * @author zuoyan * */ public class ShiroUtil { /** * 获取当前用户 1.配置文件的位置 2.用户得账号 3.用户的密码 * @param configFile * @param userName * @param password * @return */ 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 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; } }
shiro_role.int配置文件中的内容
[users] zuoyan=zuoyan123,role1,role2,role3 java1234=123456,role1,role2 jack=123,role1
还有最后就是在测试方法中调用的代码
RoleTest.java
package com.zuoyan.shiro; import java.util.Arrays; import org.apache.shiro.subject.Subject; import org.junit.Test; import com.zuoyan.utils.ShiroUtil; public class RoleTest { @Test public void testHasRole() { Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "zuoyan", "zuoyan123"); // Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123"); System.out.println(currentUser.hasRole("role1")?"有role1这个角色":"没有role1这个角色"); boolean []results=currentUser.hasRoles(Arrays.asList("role1","role2","role3")); System.out.println(results[0]?"有role1这个角色":"没有role1这个角色"); System.out.println(results[1]?"有role2这个角色":"没有role2这个角色"); System.out.println(results[2]?"有role3这个角色":"没有role3这个角色"); System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2"))?"role1,role2这两个角色都有":"role1,role2这个两个角色不全有"); currentUser.logout(); } @Test public void testCheckRole() { Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "java1234", "123456"); // Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123"); currentUser.checkRole("role1"); //这两个方法是一样的如果没有通过就会报错 currentUser.checkRoles(Arrays.asList("role1","role2")); currentUser.checkRoles("role1","role2","role3"); currentUser.logout(); } }
这种情况是认证成功的效果
如果要是用户的认证都没有通过的话,那么向下执行就会显示没有XXX这个角色
--------------------------------------------------------------下面学习授权-------------------------------------------------------------
在资源文件下创建 shiro_permission.ini
文件中的内容为:
[users] java1234=123456,role1,role2 jack=123,role1 [roles] role1=user:select role2=user:add,user:update,user:delete
role1 角色只具有查找的权限 role2的角色可以进行 增 删 改
新建一个测试类,就是测试角色权限的
如下代码
package com.zuoyan.shiro; import org.apache.shiro.subject.Subject; import org.junit.Test; import com.zuoyan.utils.ShiroUtil; public class PermissionTest { @Test public void testIsPermitted() { Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java1234", "123456"); // Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123"); System.out.println(currentUser.isPermitted("user:select")?"有user:select这个权限":"没有user:select这个权限"); System.out.println(currentUser.isPermitted("user:update")?"有user:update这个权限":"没有user:update这个权限"); boolean results[]=currentUser.isPermitted("user:select","user:update","user:delete"); System.out.println(results[0]?"有user:select这个权限":"没有user:select这个权限"); System.out.println(results[1]?"有user:update这个权限":"没有user:update这个权限"); System.out.println(results[2]?"有user:delete这个权限":"没有user:delete这个权限"); System.out.println(currentUser.isPermittedAll("user:select","user:update")?"有user:select,update这两个权限":"user:select,update这两个权限不全有"); currentUser.logout(); } @Test public void testCheckPermitted() { Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java1234", "123456"); // Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123"); currentUser.checkPermission("user:select"); currentUser.checkPermissions("user:select","user:update","user:delete"); currentUser.logout(); } }
运行效果图
这次测试更换一个用户账号,权限比较小的,
判断权限的语句 :currentUser.isPermitted (参数是用户的权限)
返回值是bool类型的
使用check的情况
如果不成功 就会抛出异常! 而且没有返回值