Shiro安全权限框架

news2025/6/6 16:25:52

在这里插入图片描述

①、添加依赖
在这里插入图片描述

②、创建ini文件

获取权限相关信息可以通过数据库获取,也可以通过ini配置文件获取
在这里插入图片描述
在这里插入图片描述

③、认证代码

public class ShiroRun{
	
	public static void main(){
		
		//初始化获取SecurityManager
		IniSerucityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
		SecurityManager securityManager = factory.getInstance();
		SecurityUtils.setSecurityManager(securityManager);
		
		//创建Subject
		Subject subject = SecurityUtils.getSubject();

		//创建token对象,web应用用户名密码从页面传递
		AuthenticationToken = token = new UsernamePasswordToken("zhangsan","z3");

		//完成登录
		try{
			subject.login(token);
			System.out.println("登录成功");

			//判断角色
			boolean hasRole = subject.hasRole("role1");
			System.out.println("是否拥有此角色 = " + hasRole);

			//判断权限
			boolean permitted = subject.isPermitted("user:insert");
			System.out.println("是否拥有此权限 = " + permitted);

			//也可以通过checkPermission方法,但没有返回值,没权限抛出AuthenticationException
			subject.checkPermission("user:select");
		}
		catch(UnknownAccountException e){
			e.printStackTrace();
			System.out.println("用户不存在");
		}
		catch(IncorrectBredentialsException e){
			e.printStackTrace();
			System.out.println("密码错误")
		}
		catch(AuthenticationException e){
			e.printStackTrace();
		}
	}
}

授权方式

编程式:

if(subject.hasRole("admin")){
	//有权限
}else{
	//无权限
}

注解式:

@RequiresRoles("admin")
public void hello(){
	
	//有权限
}

JSP/GSP标签:

<shiro:hasRole name="admin">
	<!--有权限-->
</shrio:hasRole>

加密方法

String password = "z3";
Md5Hash md5Hash = new Md5Hash(password);
System.out.println("md5Hash = " + md5Hash);

//带盐加密,明文后面拼接字符串,然后再进行加密
Md5Hash md5Hash2 = new Md5Hash(password,"salt");
System.out.println("md5Hash2 = " + md5Hash2.toHex())

//多次带盐迭代加密(3次迭代加密)
Md5Hash md5Hash3 = new Md5Hash(password,"salt",3);

//使用父类加密
SimpleHash simpleHash = new SimpleHash("MD5",password,"salt",3);

自定义登录认证

在这里插入图片描述

public class MyRealm extends AuthenticationRealm{
	
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)throws AuthenticationException{
		
		//1.获取身份信息
		String principal = authenticationToken.getPrincipal().toString();

		//2.获取凭证信息
		String password = new String((char[])authenticationToken.getCredentials());
		
		//3.获取数据库中从存储的用户信息
		if(principal.equals("zhangsan")){
			
			String pwdInfo = "xxxxx";//数据库中存储的加盐3次迭代的密码
			AuthenticationInfo = info = new SimpleAuthenticationInfo(
											authenticationToken.getPrincipal(),
											pwdInfo,
											ByteSource.Util.bytes("salt"),
											authenticationToken.getPrincipal().toString()
										);
			return info;
		}

		//4.创建
	}
}

SpringBoot整合Shiro

①、主要依赖和配置,以及启动类
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

②、创建数据表以及对应的实体类
在这里插入图片描述
在这里插入图片描述

③、创建mapper接口
在这里插入图片描述

④、创建Service接口及其实现类
在这里插入图片描述
在这里插入图片描述

⑤、创建Realm
在这里插入图片描述

@Component
public class MyRealm extends AuthorizingRealm{

	@Autowired
	private UserService userService;
	
	//自定义授权方法
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection){

	}

	//自定义登录认证方法
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken){
		
		//获取用户身份信息
		String name = authenticationToken.getPrincipal().toString();
		
		User user = userService.getUserInfoByName(name);
		if(user!=null){
			AuthenticationInfo info = new SimpleAuthenticationInfo(
				authenticationToken.getPrincipal(),
				user.getPwd(),
				ByteSource.Util.bytes("salt");
				authenticationToken.getprincipal().toString()
			);
			return info;
		}
		return null;
	}
}

⑥、创建配置类

@Configuration
public class ShiroConfig{
	
	@Autowired
	private MyRealm myRealm;

	@Bean
	public DefaultWebSecurityManager defaultWebSecurityManager(){
		
		//创建defaultWebSecurityManager对象
		DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
		
		//创建加密对象
		HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
		matcher.setHashAlgorithmName("md5");
		matcher.setHashIterations(3);//MD5加密迭代3次
	
		//将加密对象存储到myRealm中
		myRealm.setCredentialsMatcher(matcher);

		//将MyRealm存入defaultWebSecurityManager对象中
		defaultWebSecurityManager.setRealm(myRealm);

		return defaultWebSecurityManager;
	}

	/**
		设置内置过滤拦截
	*/
	@Bean
	public DefaultShiroFilterChainDefinition shiroFilterChainDefinition(){
		
		DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();

		//设置不认证可以访问的资源
		definition.addPathDefinition("/myController/userLogin","anon");
		definition.addPathDefinition("/login","anon");
		//设置需要进行登录认证的拦截范围
		definition.addPathDefinition("/**","authc");
		return definition;
	}
}

⑦、Controller

@Controller
@RequestMapping("myController")
public class MyController{

	//跳转登录页面
	@GetMapping("login")
	public String login(){
		return "login";
	}
	
	@GetMapping("uerLogin")
	//@ResponseBody  如果不返回数据,需要跳转页面,添加参数session
	public String userLogin(String name,String pwd,HttpSession session){
		
		//获取subject
		Subject subject = SecurityUtils.getSubject();
		
		//封装请求数据到token
		AuthenticationToken token = new UsernamePasswordToken(name,pwd);
		
		try{
			subject.login(token);
			//return "登录成功";
			session.setAttribute("user",token.getPrincipal().toString());
			return "main";
		}catch(AuthenticationException e){
			e.printStackTrace();
			System.out.println("登录失败");
			return "登录失败";
		}
	}
}

在这里插入图片描述

⑧、Shiro整合thymeleaf
在这里插入图片描述
在这里插入图片描述

多个realm的认证策略

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

rememberMe功能

勾选之后,登录之后,关闭浏览器,重新开启浏览器登录,无需再次输入用户名和密码
在这里插入图片描述

  • defaultWebSecurityManager.setRemberMeManager(rememberManager())
  • cookie属性设置
  • 创建Shiro的cookie管理对象
  • 添加用户过滤器(rememberMe)
  • controller中的userLogin方法增加参数rememberMe
  • 改造login登录页面
@Configuration
public class ShiroConfig{
	
	@Autowired
	private MyRealm myRealm;

	@Bean
	public DefaultWebSecurityManager defaultWebSecurityManager(){
		
		//创建defaultWebSecurityManager对象
		DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
		
		//创建加密对象
		HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
		matcher.setHashAlgorithmName("md5");
		matcher.setHashIterations(3);//MD5加密迭代3次
	
		//将加密对象存储到myRealm中
		myRealm.setCredentialsMatcher(matcher);

		//将MyRealm存入defaultWebSecurityManager对象中
		defaultWebSecurityManager.setRealm(myRealm);

		//设置rememberMe
		defaultWebSecurityManager.setRemberMeManager(rememberManager());

		return defaultWebSecurityManager;
	}

	//cookie属性设置
	public SimpleCookie rememberMeCookie(){
		
		SimpeCookie cookie = new SimpleCookie("rememberMe");
		//设置跨域
		cookie.setDomain(domain);
		cookie.setPath("/");
		cookie.setHttpOnly(true);
		cookie.setMaxAge(30*24*60*60);
		return cookie;
	}

	//创建Shiro的cookie管理对象
	public CookieRememberMeManager rememberMeManager(){
	
		CookieRememberManager cookieRememberManager = new CookieRememberManager();
		cookieRememberMeManager.setCookie(rememberMeCookie());
		cookieRememberMeManager.setCipherKey("".getBytes());

		return cookieRememberManager;
	}

	/**
		设置内置过滤拦截
	*/
	@Bean
	public DefaultShiroFilterChainDefinition shiroFilterChainDefinition(){
		
		DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();

		//设置不认证可以访问的资源
		definition.addPathDefinition("/myController/userLogin","anon");
		definition.addPathDefinition("/login","anon");
		//设置需要进行登录认证的拦截范围
		definition.addPathDefinition("/**","authc");
		//添加用户过滤器(rememberMe)
		definition.addPathDefinition("/**","user");
		return definition;
	}
}
//Controller方法
@GetMapping("userLogin")
public String userlogin(String name,String pwd,@RequestParam(defaultValue="false")boolean rememberMe,
						HttpSession session){
	
	//AuthenticationToken token = new UsernamePasswordToken(name,pwd,rememberMe);
}

//登录认证验证rememberMe
@GetMapping("userLoginRm")
public String userLogin(HttpSession session){
	session.setAttribute("user","rememberMe");
	return "main";
}

在这里插入图片描述

用户登录认证后登出

通过Shiro过滤器实现

在这里插入图片描述
在这里插入图片描述

角色认证

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

授权验证异常处理

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现缓存

在这里插入图片描述
在这里插入图片描述

public class TestEH{
	
	public static void main(String[] args){
		
		//获取编译目录下的资源流对象
		InputStream input = TestEH.class.getClassLoader().getResourceAsStream("eccache.xml");
		
		//获取Ehcache的缓存管理对象
		CacheManager cacheManager = new CacheManager(input);
		//获取缓存对象
		Cache cache = cacheManager.getCache("HelloWorldCache");
		//创建缓存数据
		Element element = new Element("name","zhang3");
		//存入缓存
		cache.put(element);
		//从缓存中取数据
		Element element1 = cache.get("name");
		System.out.println("缓存中数据 = " + element1.getObjectValue())
	}
}

Shiro整合EhCache
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2399500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟现实教育终端技术方案——基于EFISH-SCB-RK3588的全场景国产化替代

一、VR教育终端技术挑战与替代价值 ‌实时交互性能瓶颈‌ 赛扬N100/N150仅支持3DOF渲染&#xff08;延迟&#xff1e;25ms&#xff09;&#xff0c;动态手势识别帧率≤15FPS&#xff0c;难以满足6DOF教学场景需求RK3588 Mali-G610 GPU支持6DOF空间渲染&#xff08;延迟≤12ms&…

网络安全A模块专项练习任务五解析

任务五:Linux 操作系统安全配置-1 任务环境说明: ✓ 服务器场景:LinuxServer:(开放链接) ✓ 用户名:root&#xff0c;密码:123456 ✓ 数据库用户名:root&#xff0c;密码:123456 请对服务器 LinuxServer 按要求进行相应的设置&#xff0c;提高服务器的安全性。 1.设置最小…

Redis初入门

Nosql&#xff1a;Not-Only SQL&#xff08;泛指非关系型数据库&#xff09;&#xff0c;作为关系型数据库的补充 作用&#xff1a;应对基于海量用户和海量数据前提下的数据处理问题 redis&#xff1a;C语言开发的一个开源的高性能键值对数据库 特征&#xff1a; 1、数据之…

(10)Fiddler抓包-Fiddler如何设置捕获Firefox浏览器的Https会话

1.简介 经过上一篇对Fiddler的配置后&#xff0c;绝大多数的Https的会话&#xff0c;我们可以成功捕获抓取到&#xff0c;但是有些版本的Firefox浏览器仍然是捕获不到其的Https会话&#xff0c;需要我们更进一步的配置才能捕获到会话进行抓包。 2.环境 1.环境是Windows 10版…

使用pandas实现合并具有共同列的两个EXCEL表

表1&#xff1a; 表2&#xff1a; 表1和表2&#xff0c;有共同的列“名称”&#xff0c;而且&#xff0c;表1的内容&#xff08;行数&#xff09;<表2的行数。 目的&#xff0c;根据“名称”列的对应内容&#xff0c;将表2列中的“所处行业”填写到表1相应的位置。 实现代…

2025年- H69-Lc177--78.子集(回溯,组合)--Java版

1.题目描述 2.思路 3.代码实现 class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> resnew ArrayList<>();List<Integer> curnew ArrayList<>();//从索引0开始递归backtracking(res,cur,nums,0…

目标检测任务的评估指标mAP50和mAP50-95

mAP50 和 mAP50-95 是目标检测任务中常用的评估指标&#xff0c;用于衡量模型在不同 交并比&#xff08;IoU&#xff09;阈值 下的平均精度&#xff08;Average Precision, AP&#xff09;。它们的区别主要体现在 IoU 阈值范围 上。 ✅ 1. mAP50&#xff08;mean Average Prec…

C++String的学习

1、C语言中的字符串 C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff08;即面向对象编程&#xff08;…

java day15 (数据库)

进入数据库的学习 DB 因为数据太多了&#xff0c;方便统一管理的软件 操作就不用改代码了&#xff0c;直接改数据库则可&#xff1b; 命令就是sql语句 这些都是关系型数据库&#xff0c;sql可以控制全部&#xff0c;至于具体的环境我以前就有安装过了&#xff1b; 理解&am…

多线程爬虫使用代理IP指南

多线程爬虫能有效提高工作效率&#xff0c;如果配合代理IP爬虫效率更上一层楼。作为常年使用爬虫做项目的人来说&#xff0c;选择优质的IP池子尤为重要&#xff0c;之前我讲过如果获取免费的代理ip搭建自己IP池&#xff0c;虽然免费但是IP可用率极低。 在多线程爬虫中使用代理I…

前端面试真题(第一集)

目录标题 1、跨域问题及解决方法同源策略生产环境解决方案开发环境解决方案其他解决方案 2、组件间通信方式Vue2中的组件通信方式Vue3中的组件通信方式通用注意事项 3、微信小程序生命周期微信小程序原生生命周期UniApp生命周期 4、微信小程序授权登录流程登录流程手机号获取 5…

TDengine 高级功能——流计算

简介 在时序数据的处理中&#xff0c;经常要对原始数据进行清洗、预处理&#xff0c;再使用时序数据库进行长久的储存&#xff0c;而且经常还需要使用原始的时序数据通过计算生成新的时序数据。在传统的时序数据解决方案中&#xff0c;常常需要部署 Kafka、Flink 等流处理系统…

05.字母异位词分组

题意理解 &#x1f9e0; 什么是“字母异位词”&#xff1f; 字母异位词是指由相同的字母组成&#xff0c;只是排列顺序不同的单词。 比如&#xff1a; "eat" 和 "tea" 是异位词&#xff0c;它们都包含 e、a 和 t。"ate" 也是它们的异位词。但…

Mac查看MySQL版本的命令

通过 Homebrew 查看&#xff08;如果是用 Homebrew 安装的&#xff09; brew info mysql 会显示你安装的版本、路径等信息。 你的终端输出显示&#xff1a;你并没有安装 MySQL&#xff0c;只是查询了 brew 中的 MySQL 安装信息。我们一起来看下重点&#xff1a; &#x1f9fe…

【.net core】【watercloud】树形组件combotree导入及调用

源码下载:combotree: 基于layui及zTree的树下拉框组件 链接中提供了组件的基本使用方法 框架修改内容 1.文件导入&#xff08;路径可更具自身情况自行设定&#xff09; 解压后将文件夹放在图示路径下&#xff0c;修改文件夹名称为combotree 2.设置路径&#xff08;设置layu…

2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告 | 珂学家

前言 题解 2021 RoboCom 世界机器人开发者大赛-高职组&#xff08;复赛&#xff09;解题报告。 模拟题为主&#xff0c;包含进制转换等等。 最后一题&#xff0c;是对向量/自定义类型&#xff0c;重定义小于操作符。 7-1 人工智能打招呼 分值: 15分 考察点: 分支判定&…

34.1STM32下的can总线实现知识(区分linux)_csdn

看过我之前的文章就知道&#xff0c;正点原子下的linux中CAN总线并没有讲的很明白&#xff0c;都是系统自带的&#xff01; 这里我找到江科大学长的can总线的讲解视频&#xff01; CAN总线入门教程-全面细致 面包板教学 多机通信_哔哩哔哩_bilibili 在这里我也会一步一步讲解CA…

2025年想冲网安方向,该考华为安全HCIE还是CISSP?

打算2025年往网络安全方向转&#xff0c;现在考证是不是来得及&#xff1f;考啥证&#xff1f; 说实话&#xff0c;网络安全这几年热得发烫&#xff0c;但热归热&#xff0c;入门门槛也不低&#xff0c;想进这个赛道&#xff0c;技术、项目经验、证书&#xff0c;缺一不可。 …

153页PPT麦肯锡咨询流程管理及企业五年发展布局构想与路径规划

麦肯锡咨询的流程管理以其高度结构化、数据驱动和结果导向的核心特点著称&#xff0c;旨在为客户提供清晰、可行且价值最大化的解决方案。其典型流程可概括为以下几个关键阶段&#xff1a;下载资料请查看文章中图片右下角信息 问题界定与结构化&#xff1a; 这是流程的基石。麦…

[特殊字符] 革命性AI提示词优化平台正式开源!

AI时代最强大的Prompt工程师已经到来&#xff01; 你是否还在为写不出高质量提示词而头疼&#xff1f;是否羡慕那些能够驾驭AI、让ChatGPT、Claude乖乖听话的"提示词大师"&#xff1f;今天&#xff0c;我们为你带来一个颠覆性的解决方案——TokenAI Auto-Prompt&…