Shiro会话管理和加密

会话管理

Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Tomcat),不管是J2SE还是J2EE环境都可以使用,提供了会话管理,会话事件监听,会话存储/持久化,容器无关的集群,失效/过期支持,对Web的透明支持,SSO单点登录的支持等特性。

会话管理

Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Tomcat),不管是J2SE还是J2EE环境都可以使用,提供了会话管理,会话事件监听,会话存储/持久化,容器无关的集群,失效/过期支持,对Web的透明支持,SSO单点登录的支持等特性。

会话使用
建议在开发中,Controller层使用原生的HttpSession对象,在Service层中使用Shiro提供的Session对象。如果在Service层中使用HttpSession对象,那么属于侵入式,并不建议这么做。
shiro提供的Session能够很好的解决这个问题。
在Controller中,通过request.getSession()获取会话session,该session到底来源于ServletRequest还是由Shiro管理并创建会话,主要由安全管理器SecurityManage和SessionManager会话管理器决定。
在使用默认SessionManager会话管理器的情况下,不管是通过request.getSession()或者subject.getSession()获取到session,操作session,两者都是等价的,请大家放心使用!

缓存
问题分析
每次在访问设置了权限的页面时,都会去执行doGetAuthorizationInfo()方法来获取权限信息判断当前用户是否具备访问权限。由于在实际情况中,权限是不会经常改变的,能否不用每次都去执行doGetAuthorizationInfo()方法获取权限呢?

解决方法
解决方法就是对权限授权数据进行缓存处理,我们会使用第三方的shiro-redis集成redis实现缓存。

具体实现

1.添加依赖

<dependency><groupId>org.crazycake</groupId><artifactId>shiro-redis</artifactId><version>3.1.0</version>
</dependency>

2.application.properties配置文件中添加Redis配置

driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springboot?useTimezone=true&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=falseusername: rootpassword: hzx

3.改造ShiroConfig
ShiroConfig改造的步骤如下:

注入Rrdis参数:@Value注解从application.properties配置文件中获取
添加redisManager():创建RedisManager
添加cacheManager():创建RedisCacheManager,注入RedisManager
添加redisSessionDao():创建RedisSessionDAO,注入RedusSessionDAO
修改myShiroRealm():创建MyShiroRealm,启用缓存
修改securityManager():创建SecurityManager,注入MyShiroRealm、RedisCacheManager、SessionManager

@Configuration
public class ShiroConfig {//注入Redis参数,从application.properties获得@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;/*  @Value("${spring.redis.password}")private String password;*/@Value("${spring.redis.timeout}")private int timeout;@Resourceprivate RoleService roleService;/*  @Bean(name="shiroDialect")public ShiroDialect shiroDialect(){return new ShiroDialect();}*//*** 开启Shiro注解(如@RequiresRoles,@RequiresPermissions),* 需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证* 配置以下两个bean(DefaultAdvisorAutoProxyCreator和AuthorizationAttributeSourceAdvisor)* @return*/@Beanpublic DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();advisorAutoProxyCreator.setProxyTargetClass(true);return advisorAutoProxyCreator;}/*** 开启aop注释支持*/@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor=new AuthorizationAttributeSourceAdvisor();authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);return authorizationAttributeSourceAdvisor;}public RedisManager redisManager(){RedisManager redisManager=new RedisManager();redisManager.setHost(host);redisManager.setPort(port);/*     redisManager.setPassword(password);*/redisManager.setTimeout(timeout);return redisManager;}public RedisCacheManager cacheManager(){RedisCacheManager cacheManager=new RedisCacheManager();cacheManager.setRedisManager(redisManager());//缓存名称cacheManager.setPrincipalIdFieldName("usrName");//缓存有效时间cacheManager.setExpire(1800);return cacheManager;}//会话操作public RedisSessionDAO redisSessionDAO(){RedisSessionDAO sessionDAO=new RedisSessionDAO();sessionDAO.setRedisManager(redisManager());return sessionDAO;}//会话管理public DefaultWebSessionManager sessionManager(){DefaultWebSessionManager sessionManager=new DefaultWebSessionManager();sessionManager.setSessionDAO(redisSessionDAO());return  sessionManager;}@Beanpublic MyShiroRealm myShiroRealm(){//自定义RealmMyShiroRealm shiroRealm=new MyShiroRealm();//设置启用缓存,并设置缓存名称shiroRealm.setCachingEnabled(true);shiroRealm.setAuthorizationCachingEnabled(true);shiroRealm.setAuthenticationCacheName("authorizationCache");//设置凭证(密码)匹配器shiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());return shiroRealm;}@Beanpublic SecurityManager securityManager(){//安全管理器SecurityManagerDefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();//注入RealmsecurityManager.setRealm(myShiroRealm());//注入缓存管理器securityManager.setCacheManager(cacheManager());//注入会话管理器securityManager.setSessionManager(sessionManager());return securityManager;}@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){//Shiro过滤器:权限认证ShiroFilterFactoryBean shiroFilterFactory=new ShiroFilterFactoryBean();//注入SecurityManagershiroFilterFactory.setSecurityManager(securityManager);//权限验证:使用Filter控制资源(URL)的访问shiroFilterFactory.setLoginUrl("/dologin");shiroFilterFactory.setSuccessUrl("/main");shiroFilterFactory.setUnauthorizedUrl("/403");//没有权限跳转403页面Map<String,String> filterChianDefinitionMap=new LinkedCaseInsensitiveMap<String>();//必须使用LinkedHashMap(有序集合)//配置可以匿名访问的资源(URL):静态资源filterChianDefinitionMap.put("/css/**","anon");filterChianDefinitionMap.put("/fonts/**","anon");filterChianDefinitionMap.put("/images/**","anon");filterChianDefinitionMap.put("/js/**","anon");filterChianDefinitionMap.put("/localcss/**","anon");filterChianDefinitionMap.put("/localjs/**","anon");filterChianDefinitionMap.put("/login","anon");filterChianDefinitionMap.put("/logout","logout");//注销过滤器,自动注销//配置需要特定权限才能访问的资源(URL)//静态权限:包括全部需要特定权限才能访问的资源(URL)/* filterChianDefinitionMap.put("/user/list","perms[用户列表]");filterChianDefinitionMap.put("/user/add","perms[用户添加]");filterChianDefinitionMap.put("/user/edit","perms[用户修改]");filterChianDefinitionMap.put("/user/del","perms[用户删除]");*///动态授权List<Right> rights=roleService.findAllRights();for(Right right:rights){if(right.getRightUrl()!=null&&!right.getRightUrl().trim().equals("")){filterChianDefinitionMap.put(right.getRightUrl(),"perms["+right.getRightCode()+"]");}}//配置认证访问,其他资源(URL)必须认证通过才能访问filterChianDefinitionMap.put("/**","authc");//必须放在过滤器链最后面shiroFilterFactory.setFilterChainDefinitionMap(filterChianDefinitionMap);return shiroFilterFactory;}
}

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

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

相关文章

python开发工具是选择vscode还是pycharm?两款软件优缺点对照!

Pycharm和VSCode是两款流行的代码编辑器&#xff0c;它们都有各自的优缺点和适用情况。本文将从以下几个方面对它们进行比较和分析&#xff1a; 功能和扩展性性能和稳定性用户体验和界面价格和支持 功能和扩展性 Pycharm是一款专为Python开发而设计的集成开发环境&#xff08;…

《一人公司:失业潮中的高新技术工作者》读书笔记

基本信息 书名&#xff1a;一人公司&#xff1a;失业潮中的高新技术工作者作者&#xff1a;[美]卡丽莱恩&#xff08;Carrie M. Lane&#xff09;出版社&#xff1a;广东人民出版社出版时间&#xff1a;2023年11月 内容简介 本书通过18个月的田野调查和9年的跟踪寻访&#…

部署DNS主从服务器

一。DNS主从服务器作用&#xff1a; DNS作为重要的互联网基础设施服务&#xff0c;保证DNS域名解析服务的正常运转至关重要&#xff0c;只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中&#xff0c;从服务器可以从主服务器上获取指定的区域数据文件&…

es(1)(仅供自己参考)

elasticsearch&#xff08;ES&#xff09;是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量的数据中快速找到需要的内容。 elastic stack&#xff08;ELK&#xff09;&#xff1a;elasticsearch结合kibana、Logstash、Beats。被广泛的应用在日志数据分析、实时监控…

关于k8s的cilium网络插件踩坑记

cilium状态为CrashLoopBackOff coredns状态为Pending 使用的系统镜像为centos7.6 内核是3.*** 然后用的工具来部署集群&#xff0c;开始以为是调度啥的&#xff0c;然后单节点试也出现CrashLoopBackOff、Pending等状态&#xff0c;更新内核在到5 集群自己就好了 注意&am…

设计模式(三)

设计模式(三) 某些情况&#xff0c;可能会过度地使用继承来扩展对象的功能&#xff1b; 由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b; 随着子类增多&#xff0c; 各种子类的组合会导致更多子类的膨胀 需要使用对象功能的扩展&#xff…

openssl 自签证书

生成自签证书脚本 #!/bin/bash KEY_LENGTH4096 DAYS3650 STDongBei LLiaoNing ONASA OUNASA CN*.dongbei.nasa.edu.cn EMAILxxxqq.com# 生成私有证书密钥 openssl genrsa -out server.key ${KEY_LENGTH} # 生成证书请求文件 # 警告:一定要用双引号&#xff08;单引号不解析变量…

信创认证(信创人才考评证书)的含金量?到底有多少?

“信创认证”是什么&#xff1f; 信创认证是由工业和信息化部教育与考试中心推出的国家级权威认证&#xff0c;旨在推动信息技术应用创新产业的发展&#xff0c;并构建完善的信创产业人才培养体系。该认证在个人信息技术领域具有极高的认可度。 信创认证分为初级、中级和高级三…

新手铲屎官提问,有哪几款噪音低的宠物空气净化器推荐

相信很多铲屎官都明白的的痛就是猫咪掉毛太严重&#xff0c;所以每次看到满天飞的浮毛时只想赶紧逃离&#xff0c;一点都不想清理。但是家是自己的&#xff0c;猫是自己的&#xff0c;健康也是自己的&#xff0c;不清理也得清理。 为了更有效的清理浮毛&#xff0c;我朋友特意…

参会记录|2024 中国计算机大会(CNCC 2024)

前言&#xff1a;2024年10月24-26日&#xff0c;有幸在横店参加了2024年度的中国计算机大会&#xff08;CNCC&#xff09;&#xff0c;本篇博客总结本人在会议期间收听的主要报告内容及收获。 2024.10.24 上午 夏苑海岳开襟 如何实现人工智能在现实场景中的落地&#xff1f; …

OgCloud参加HPE Discover More AI 2024,共建数智化未来!

10月16日&#xff0c;企业科技盛会HPE Discover More AI 2024在香港瑰丽酒店举行。本次大会Hewlett Packard Enterprise (HPE) 联同全球14个科技合作伙伴&#xff0c;聚焦于AI未来走势、混合云创新与边缘安全等领域&#xff0c;以主题演讲、技术展示、研讨会等形式进行&#xf…

从双斜率,野人除法看性能优化

人呐&#xff0c;天生对线性的推崇&#xff0c;却在内心又对线性的不爱。一开始人们总是从最简单的线性过程入手&#xff0c;但最终都难免因为不满足而进入指数过程。 看一个 Linux kernel 老式 O(1) 调度器的时间片计算函数的演化&#xff1a; 早期的 O(1) 是一个连续线性函…

vue 解决:npm ERR! code ERESOLVE 及 npm ERR! ERESOLVE could not resolve 的方案

1、问题描述&#xff1a; 其一、需求为&#xff1a; 想要安装项目所需依赖&#xff0c;成功运行 vue 项目&#xff0c;想要在浏览器中能成功访问项目地址 其二、问题描述为&#xff1a; 在 package.json 文件打开终端平台&#xff0c;通过执行 npm install 命令&#xff0c…

【MySQL】视图特性 用户管理

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是视图&#xff0c;我们又该如何管理用户。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…

kafka 如何减少数据丢失?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 如何减少数据丢失?】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 如何减少数据丢失? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个高吞吐量的分布式消息队列&#xff0c;广泛用…

简单记录ios打包流程

1、点击这里获取UDID 2、xcode登录开发者账户、确定唯一id&#xff08;Bundle ID&#xff09; 3、去这里注册appid 4、在这里这里创建app 5、之后xcode中打包

Mac 出现zsh: command not found: aapt

Mac 运行aapt命令 提示&#xff1a;zsh: command not found: aapt 这个问题是Mac本地没有配置 aapt的 环境变量。理论上本地有Android Studio&#xff0c;aapt是默认配置了的&#xff0c;无奈要用到aapt&#xff0c;还是配置下吧。 mac zsh 配置 aapt 环境变量的方法&#xf…

前端对一个增删改查的思考

1、来源&#xff1a;dify dify/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx at main langgenius/dify GitHub 2、代码流程&#xff1a; 3、思索问题&#xff1a; 1、为啥要用return形式&#xff0c;而不是value直接当函数&#xff1…

SQL进阶技巧:如何求组内排除当前行的移动平均值?

目录 0 需求描述 2 数据准备 3 问题分析 4 小结 0 需求描述 -- 按照 日期,省份,等级 分组 求分数的平均值;但是需要剔除当前行的数据 2 数据准备 create table avgtest as (select 2024-10-24 as cdate, 广东 as province,深圳 as city, 2 as level, 200 as scoreunio…

ssm005基于SSM框架的购物商城系统的开发与实现(论文+源码)_kaic

设计题目&#xff1a;购物商城系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对…