Shiro学习笔记 三(认证授权)
时间:2022-07-26
本文章向大家介绍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的情况
如果不成功 就会抛出异常! 而且没有返回值
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Day46:孩子们的游戏(圆圈中最后剩下的数)
- 3分钟短文:Laravel 检查记录是否被软删除
- Day47:求1+2+3+……+n
- 3分钟短文:Laravel 使用DB门面操作原生SQL
- Day48:不用加减乘除做加法
- Day49:将字符串转换成整数
- Day50:数组中重复的数字
- 3分钟短文:Laravel模型OR查询避坑指南
- Day51:构建乘积数组
- 3分钟短文:Laravel ORM 模型用法纲要
- Day52:正则表达式匹配
- 3分钟短文:Laravel 模型查询数据库的几个关键方法
- Day53:表示数值的字符串
- 3分钟短文:Laravel模型写操作很简单,大多数人容易用错
- Day54:字符流中第一个不重复的字符