1、基础配置

@Configuration
public class ShiroConfig {/*** myRealm*/@Beanpublic ShiroRealm shiroRealm(ConfigParam configParam) {ShiroRealm shiroRealm = new ShiroRealm();shiroRealm.setConfigParam(configParam);if(configParam.getEncryption() != null){EncryptionParam encryptionParam = configParam.getEncryption();if(encryptionParam.isEnable()) { //是否加密//注意加密,前端登录进来的是应该是明文或者是要加密前的密码//realm 加载回来的是加密后保存数据库的密码,这里根据保存数据库的密码加密方式以及加密次数盐值进行加密比较HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();hashedCredentialsMatcher.setHashAlgorithmName(StringUtils.isNullOrEmtry(encryptionParam.getType()) ? "MD5" : encryptionParam.getType());hashedCredentialsMatcher.setHashIterations(encryptionParam.getCount() == null ? 1 : encryptionParam.getCount());shiroRealm.setCredentialsMatcher(hashedCredentialsMatcher);}}return shiroRealm;}/*** 缓存管理*/@Beanpublic ShiroCacheManager shiroCacheManager() {ShiroCacheManager cacheManager = new ShiroCacheManager(); //自定义缓存管理器,实现cachereturn cacheManager;}/*** 安全管理器*/@Beanpublic SecurityManager securityManager(ConfigParam configParam, ShiroRealm shiroRealm, ShiroCacheManager shiroCacheManager, DefaultWebSessionManager sessionManager, CookieRememberMeManager rememberMeManager){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(shiroRealm);securityManager.setCacheManager(shiroCacheManager);securityManager.setSessionManager(sessionManager);RememberMeParam rememberMeParam = configParam.getRememberMe();if(rememberMeParam != null && rememberMeParam.isEnable()) {securityManager.setRememberMeManager(rememberMeManager);}return securityManager;}/*** shiro拦截器*/@Beanpublic ShiroFilterFactoryBean shiroFileter(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);Map<String, Filter> filters = new HashMap<String, Filter>();ShiroAuthFilter filter = new ShiroAuthFilter();
//        filter.setRememberMeParam("rememberMe");filters.put("shiroAuthFilter", filter);shiroFilterFactoryBean.setFilters(filters);Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();//配置不会被拦截的链接,顺序判断filterChainDefinitionMap.put("/api/logout", "anon");filterChainDefinitionMap.put("/api/login", "anon");filterChainDefinitionMap.put("/api/kaptcha", "anon");filterChainDefinitionMap.put("/api/**", "shiroAuthFilter");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;}/*** shiro生命周期 , 初始化和销毁的类* 将Initializable和Destroyable的实现类统一在其内部自动分别调用了Initializable.init()和Destroyable.destroy()方法,从而达到管理shiro bean生命周期的目的。* (可选)*/@Bean(name = "lifecycleBeanPostProcessor")public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){return new LifecycleBeanPostProcessor();}/*** 自动创建代理 Spring的一个bean , 由Advisor决定对哪些类的方法进行AOP代理 .* 是用来扫描上下文,寻找所有的Advistor(通知器),将这些Advisor应用到所有符合切入点的Bean中。所以必须在lifecycleBeanPostProcessor创建之后创建*/@Bean@DependsOn({"lifecycleBeanPostProcessor"})public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();advisorAutoProxyCreator.setProxyTargetClass(true);return advisorAutoProxyCreator;}/***  开启shiro aop注解支持.否则@RequiresRoles等注解无法生效*/@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);return authorizationAttributeSourceAdvisor;}}
ShiroCacheManager:实现自定义的缓存管理器,定义实现cache接口的缓存
ShiroRealm:实现用户权限数据的获取,并且根据需要配置加密(根据数据库保存的密码加密方式,对登录的密码进行加密匹配)
shiroFileter:配置自定义的过滤器,并且根据对应的url配置对应的拦截

2、会话配置

@Configuration
public class SessionConfig {/*** 会话cookie模板 ,用于重写覆盖容器默认的JSESSIONID的key name*/@Beanpublic SimpleCookie sessionIdCookie() {SimpleCookie simpleCookie = new SimpleCookie();simpleCookie.setName("shiroSessionId");simpleCookie.setHttpOnly(true);
//        simpleCookie.setValue("WEBSID"); //这个不需要设置值,登录成功之后storeSessionId方法会设置return simpleCookie;}/*** 会话sessionDao*/@Beanpublic EnterpriseCacheSessionDAO sessionDAO() {EnterpriseCacheSessionDAO mySessionDao = new EnterpriseCacheSessionDAO();mySessionDao.setActiveSessionsCacheName("activeSessionCache"); //getCache的name, 构建缓存key的时候会用到return mySessionDao;}/*** 会话管理*/@Beanpublic DefaultWebSessionManager sessionManager(EnterpriseCacheSessionDAO sessionDAO, SimpleCookie sessionIdCookie) {DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();sessionManager.setGlobalSessionTimeout(1800000); // 设置全局会话超时时间 半小时,session 有效时间为半小时 (毫秒单位)sessionManager.setDeleteInvalidSessions(true); // 是否删除无效的,默认也是开启sessionManager.setSessionDAO(sessionDAO);sessionManager.setSessionIdUrlRewritingEnabled(false); //url上带sessionId 默认为truesessionManager.setSessionIdCookie(sessionIdCookie);return sessionManager;}
}
sessionIdCookie:配置对应的cookie的name避免会冲突

3、记住我配置

@Configuration
public class RememberMeConfig {/*** 记住我cookie管理对象* @return*/@Beanpublic CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie, ConfigParam configParam){CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();cookieRememberMeManager.setCookie(rememberMeCookie);RememberMeParam rememberMeParam = configParam.getRememberMe();if(rememberMeParam != null && rememberMeParam.isEnable()){//rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)cookieRememberMeManager.setCipherKey(Base64.decode(StringUtils.isNullOrEmtry(rememberMeParam.getCipherKey()) ? "4AvVhmFLUs0KTA3Kprsdag==" : rememberMeParam.getCipherKey()));}return cookieRememberMeManager;}@Beanpublic SimpleCookie rememberMeCookie(ConfigParam configParam){//这个参数是cookie的名称,对应前端的checkbox的name = rememberMeSimpleCookie simpleCookie = new SimpleCookie("rememberMe");//setcookie的httponly属性如果设为true的话,会增加对xss防护的安全系数。它有以下特点://setcookie()的第七个参数//设为true后,只能通过http访问,javascript无法访问//防止xss读取cookiesimpleCookie.setHttpOnly(true);simpleCookie.setPath("/");RememberMeParam rememberMeParam = configParam.getRememberMe();if(rememberMeParam != null && rememberMeParam.isEnable()) {//记住我cookie生效时间 ,单位秒simpleCookie.setMaxAge(rememberMeParam.getRememberTime());}return simpleCookie;}
}
需要在自定义的过滤器里手动判断是否是记住我功能登录,因为设置的级别isAccessAllowed是只判断是否是登录,否则需要使用user的级别过滤才可以通过
authc是会被拦截的 shiro觉得rememberMe不安全
authc: FormAuthenticationFilter
user: UserFilter

会话验证调度器

shiro提供了会话验证调度器,用于定期的验证会话是否已过期,如果过期将停止会话;出于性能考虑,一般情况下都是获取会话时来验证会话是否过期并停止会话的;但是如在web环境中,如果用户不主动退出是不知道会话是否过期的,因此需要定期的检测会话是否过期,Shiro提供了会话验证调度器SessionValidationScheduler。

<!-- 会话验证调度器 -->
<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler"><property name="sessionManager" ref="sessionManager"/><!-- 设置调度时间间隔,单位毫秒,默认就是1小时  --><property name="interval" value="300000"/>
</bean>

Shiro也提供了使用Quartz会话验证调度器,org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler,使用时需要导入shiro-quartz依赖

<dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-quartz</artifactId>  <version>1.2.2</version>
</dependency>

会话验证调度器实现都是直接调用AbstractValidatingSessionManager 的validateSessions方法进行验证。
如果在会话过期时不想删除过期的会话,可以设置SessionManager的deleteInvalidSessions属性为false ,默认是开启的,在会话过期后会调用SessionDAO的delete方法删除会话:如会话时持久化存储的,可以调用此方法进行删除。

如果是在获取会话时验证了会话已过期,将抛出InvalidSessionException;因此需要捕获这个异常并跳转到相应的页面告诉用户会话已过期,让其重新登录

spring boot 集合 shiro相关推荐

  1. Spring Boot整合Shiro + Springboot +vue

    目录 02 Spring Boot整合Shiro p1.shiro概述 1 什么是Shiro 2 Shiro核心组件 p2.Shiro实现登录认证 AccountRealm.java QueryWra ...

  2. 六、Spring Boot整合Shiro

    六.Spring Boot整合Shiro 6.1.整合思路 6.2.创建spring boot项目 6.3.引入shiro依赖 6.4.配置shiro环境 创建配置类ShiroConfig 1.配置: ...

  3. 解决Spring Boot集成Shiro,配置类使用Autowired无法注入Bean问题

    为什么80%的码农都做不了架构师?>>>    如题,最近使用spring boot集成shiro,在shiroFilter要使用数据库动态给URL赋权限的时候,发现 @Autowi ...

  4. spring boot结合shiro实现用户-角色-权限的控制(包含用户名密码登陆和手机号验证码登陆)

    spring boot整合shiro实现权限校验 1.首先导入项目所需jar包 <parent><groupId>org.springframework.boot</gr ...

  5. Spring Boot 整合 shiro 之盐值加密认证详解(六)

    Spring Boot 整合 shiro 之盐值加密认证详解 概述 不加盐认证 加入密码认证核心代码 修改 CustomRealm 新增获取密文的方法 修改 doGetAuthenticationIn ...

  6. Spring Boot 整合 Shiro(三)Kaptcha验证码 附源码

    前言 本文是根据上篇<Spring Boot 整合Shiro(二)加密登录与密码加盐处理>进行修改,如有不明白的转上篇文章了解. 1.导入依赖 <!-- https://mvnrep ...

  7. 有手就行的 Spring Boot 集成 Shiro

    前言   Apache Shiro 是 Java 的一个安全框架.目前,使用 Apache Shiro 的人越来越多,因为它相当简单,对比 Spring Security,可能没有 Spring Se ...

  8. Spring Boot整合Shiro + JSP教程(用户认证,权限管理,图片验证码)

    在此首先感谢**编程不良人**up主提供的视频教程 代码都是跟着up的视频敲的,遇到的一些问题也是通过CSDN博主提供的教程解决的,在此也感谢那些提供bug解决方案的前辈们~ 项目完整代码已经发布到g ...

  9. Spring Boot + Vue + Shiro 实现前后端分离、权限控制

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://sina.lt/gauR 本文总结自实习中对项 ...

最新文章

  1. java linkedlist底层_手写Java LinkedList核心源码
  2. Ajax接触及对跨域的简单理解
  3. tcpdump源码分析——抓包原理
  4. ASP.NET Core 6.0对热重载的支持
  5. google账号解除游戏绑定_附方法!关于物联卡手机号的绑定与解绑
  6. linux定时器无法重启pm2,pm2无法自动重启
  7. 信息学奥赛一本通(2067:【例2.5】圆)
  8. [Vue.js]实战 -- 电商项目(六)
  9. 408计算机网络考研试题,2021考研计算机(408)试题及解析——计算机网络
  10. ie 无法运行php,PHP会话无法在IE中运行
  11. [USACO13OPEN]Luxury River Cruise【模拟】
  12. 多模态 | 从顶会论文看多模态预训练研究进展
  13. BS7799与ISO17799的发展历程
  14. 09 自动发表博客评论
  15. 当年的毒王熊猫烧香,现在怎么样了?
  16. 安徽省2016“京胜杯”程序设计大赛_C_箭无虚发
  17. 2018年浙江省网络安全技能竞赛ctf部分解题思路writeup
  18. 20种硬件工程师必知必会基础元器件|最新更新至8.13
  19. 龙王我当定了(一个在QQ刷龙王的脚本)
  20. CVPR2017 | G-RMI_Google大佬构建的姿态估计baseline

热门文章

  1. 【12月19日】传媒行业的股票排名
  2. 英语四级和计算机二级考试冲突吗,大学必须过英语四级吗?必须过计算机二级吗?...
  3. 万年历设计单片机c语言,数字万年历设计(80c51单片机、时钟芯片ds1320).pdf
  4. PyQt模拟微信聊天页面开发
  5. Zynq术语详解,不懂啥是PL,PS,APU,SCU?那就进来看看吧
  6. 网页上播放微信录音amr文件方案
  7. 部件mscomctl_mscomctl.ocx下载_mscomctl.ocx官方下载【32位64位】-太平洋下载中心
  8. 台式计算机截图快捷键,电脑截屏的快捷键是什么
  9. wbin about
  10. 图片绘制适应屏幕处理的一些思路