Shiro安全权限框架
①、添加依赖
②、创建ini文件
获取权限相关信息可以通过数据库获取,也可以通过ini配置文件获取
③、认证代码
public class ShiroRun{public static void main(){//初始化获取SecurityManagerIniSerucityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");SecurityManager securityManager = factory.getInstance();SecurityUtils.setSecurityManager(securityManager);//创建SubjectSubject 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方法,但没有返回值,没权限抛出AuthenticationExceptionsubject.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{@Autowiredprivate UserService userService;//自定义授权方法@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection){}//自定义登录认证方法@Overrideprotected 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{@Autowiredprivate MyRealm myRealm;@Beanpublic 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;}/**设置内置过滤拦截*/@Beanpublic 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 如果不返回数据,需要跳转页面,添加参数sessionpublic String userLogin(String name,String pwd,HttpSession session){//获取subjectSubject subject = SecurityUtils.getSubject();//封装请求数据到tokenAuthenticationToken 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{@Autowiredprivate MyRealm myRealm;@Beanpublic 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);//设置rememberMedefaultWebSecurityManager.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;}/**设置内置过滤拦截*/@Beanpublic 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
相关文章:

Shiro安全权限框架
①、添加依赖 ②、创建ini文件 获取权限相关信息可以通过数据库获取,也可以通过ini配置文件获取 ③、认证代码 public class ShiroRun{public static void main(){//初始化获取SecurityManagerIniSerucityManagerFactory factory new IniSecurityManagerFac…...

虚拟现实教育终端技术方案——基于EFISH-SCB-RK3588的全场景国产化替代
一、VR教育终端技术挑战与替代价值 实时交互性能瓶颈 赛扬N100/N150仅支持3DOF渲染(延迟>25ms),动态手势识别帧率≤15FPS,难以满足6DOF教学场景需求RK3588 Mali-G610 GPU支持6DOF空间渲染(延迟≤12ms&…...
深入理解CSS浮动:从基础原理到实际应用
深入理解CSS浮动:从基础原理到实际应用 引言 在网页设计中,CSS浮动(float)是一个历史悠久却又至关重要的概念。虽然现代布局技术如Flexbox和Grid逐渐流行,但浮动仍然在许多场景中发挥着重要作用。本文将带你深入理解…...
代码训练LeetCode(22)研究者H指数
代码训练(22)LeetCode之研究者H指数 Author: Once Day Date: 2025年6月4日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 274. H 指数 - 力扣(LeetCode)力扣 (LeetCode) 全球极客挚爱的…...

网络安全A模块专项练习任务五解析
任务五:Linux 操作系统安全配置-1 任务环境说明: ✓ 服务器场景:LinuxServer:(开放链接) ✓ 用户名:root,密码:123456 ✓ 数据库用户名:root,密码:123456 请对服务器 LinuxServer 按要求进行相应的设置,提高服务器的安全性。 1.设置最小…...
git cli 基于远程master分支创建本地分支并切换
1、获取远程最新状态 git fetch origin2、从远程master创建本地分支并切换 git checkout -b new-branch-name origin/master或者,新版本写法 git switch -c new-branch-name origin/master3、如果要推送到远程,并建立跟踪,执行下面的命令 …...

Redis初入门
Nosql:Not-Only SQL(泛指非关系型数据库),作为关系型数据库的补充 作用:应对基于海量用户和海量数据前提下的数据处理问题 redis:C语言开发的一个开源的高性能键值对数据库 特征: 1、数据之…...

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

使用pandas实现合并具有共同列的两个EXCEL表
表1: 表2: 表1和表2,有共同的列“名称”,而且,表1的内容(行数)<表2的行数。 目的,根据“名称”列的对应内容,将表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 是目标检测任务中常用的评估指标,用于衡量模型在不同 交并比(IoU)阈值 下的平均精度(Average Precision, AP)。它们的区别主要体现在 IoU 阈值范围 上。 ✅ 1. mAP50(mean Average Prec…...

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

java day15 (数据库)
进入数据库的学习 DB 因为数据太多了,方便统一管理的软件 操作就不用改代码了,直接改数据库则可; 命令就是sql语句 这些都是关系型数据库,sql可以控制全部,至于具体的环境我以前就有安装过了; 理解&am…...
SQL 中 IN 和 EXISTS 的区别
SQL 中 IN 和 EXISTS 的区别 1. 基本概念 1.1 IN 运算符 IN 是一个条件运算符,用于检查某个值是否存在于指定的值列表中或子查询返回的结果集中。 SELECT * FROM employees WHERE department_id IN (SELECT id FROM departments WHERE location = New York)...

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

前端面试真题(第一集)
目录标题 1、跨域问题及解决方法同源策略生产环境解决方案开发环境解决方案其他解决方案 2、组件间通信方式Vue2中的组件通信方式Vue3中的组件通信方式通用注意事项 3、微信小程序生命周期微信小程序原生生命周期UniApp生命周期 4、微信小程序授权登录流程登录流程手机号获取 5…...
电脑安装系统蓝屏的原因
1. 内存故障 原因:内存条接触不良、损坏或兼容性问题(如不同品牌 / 频率的内存混用)。表现:蓝屏代码可能包含 MEMORY_MANAGEMENT、PAGE_FAULT_IN_NONPAGED_AREA 等。排查方法: 重新插拔内存条,清理金手指灰…...

TDengine 高级功能——流计算
简介 在时序数据的处理中,经常要对原始数据进行清洗、预处理,再使用时序数据库进行长久的储存,而且经常还需要使用原始的时序数据通过计算生成新的时序数据。在传统的时序数据解决方案中,常常需要部署 Kafka、Flink 等流处理系统…...
expect程序交互学习
文章目录 一、初级语法学习二、例子 一、初级语法学习 1.使用expect进行ssh另一台机器 [rootlocalhost ~]# yum install -y expect #先安装expect [rootlocalhost ~]# vim expect1.sh #!/usr/bin/expect spawn ssh root192.168.68.244 expect {"yes/no" {send "…...

05.字母异位词分组
题意理解 🧠 什么是“字母异位词”? 字母异位词是指由相同的字母组成,只是排列顺序不同的单词。 比如: "eat" 和 "tea" 是异位词,它们都包含 e、a 和 t。"ate" 也是它们的异位词。但…...

Mac查看MySQL版本的命令
通过 Homebrew 查看(如果是用 Homebrew 安装的) brew info mysql 会显示你安装的版本、路径等信息。 你的终端输出显示:你并没有安装 MySQL,只是查询了 brew 中的 MySQL 安装信息。我们一起来看下重点: 🧾…...

【.net core】【watercloud】树形组件combotree导入及调用
源码下载:combotree: 基于layui及zTree的树下拉框组件 链接中提供了组件的基本使用方法 框架修改内容 1.文件导入(路径可更具自身情况自行设定) 解压后将文件夹放在图示路径下,修改文件夹名称为combotree 2.设置路径(设置layu…...
[Java 基础]面向对象-封装
封装是构建健壮、可维护和安全软件的基础。 什么是封装? 想象一下你的手机。你不需要知道手机内部复杂的电路、芯片和各种组件是如何协同工作的,你只需要知道如何使用屏幕、按键或触摸操作来打电话、发短信或玩游戏。手机的内部细节被“包裹”起来&…...

2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告 | 珂学家
前言 题解 2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告。 模拟题为主,包含进制转换等等。 最后一题,是对向量/自定义类型,重定义小于操作符。 7-1 人工智能打招呼 分值: 15分 考察点: 分支判定&…...
Python趣学篇:Pygame实现3D星空穿越动画
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《Python星球日记》🪐 目录 一、项目概览与技术栈二、核心技术原理解析1. 透视投影:让3D世界"压扁"到2D屏幕2. Z轴深度:创造…...
基于Web的安全漏洞分析与修复平台设计与实现
基于Web的安全漏洞分析与修复平台设计与实现 摘要 随着信息化进程的加快,Web系统和企业IT架构愈发复杂,安全漏洞频发已成为影响系统安全运行的主要因素。为解决传统漏洞扫描工具定位不准确、修复建议不完善、响应周期长等问题,本文设计并实…...

34.1STM32下的can总线实现知识(区分linux)_csdn
看过我之前的文章就知道,正点原子下的linux中CAN总线并没有讲的很明白,都是系统自带的! 这里我找到江科大学长的can总线的讲解视频! CAN总线入门教程-全面细致 面包板教学 多机通信_哔哩哔哩_bilibili 在这里我也会一步一步讲解CA…...
相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_request三级日志分析详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之二十三:高通相机Camx 基于预览1帧的process_capture_request二级日志分析详解 这一篇我们开始讲: 相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_req…...
Linux 内核中 skb_dst_drop 的深入解析:路由缓存管理与版本实现差异
引言 在 Linux 内核网络子系统中,sk_buff(简称 SKB)是数据包在内核态流转的核心数据结构。为了高效处理网络数据包的路由选择,内核通过 dst_entry 结构体缓存路由信息,而 skb_dst_drop 函数则是管理这些路由缓存引用的关键工具。本文将从作用、实现原理、内核版本差异等多…...
考研系列—操作系统:冲刺笔记(4-5章)
目录 第四章 文件管理 1.真题总结文件管理方式 (1)目录文件的FCB就是“目录名-目录地址” (2)普通文件的FCB (3)区分索引文件、顺序文件、索引分配 (4)文件的物理结构 ①连续分配方式 ②链接分配 ③索引分配-使用索引表(一个文件对应一张索引表!!!) 计算考点:超级…...