# frame **Repository Path**: lexapps/frame ## Basic Information - **Project Name**: frame - **Description**: shiro登入框架+redis存储session+jwt .适用于分布式前后端分离 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2019-02-01 - **Last Updated**: 2020-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 本框架最适用于前后端分离+分布式下的session共享的权限项目框架 tip:这是一个通用模板框架 可以适用于 前后端不分离 或者 前后端不分离 就算不是分布式下依旧可以,但是没必要. ## 使用主体框架为: springboot+mybatis-plus+shiro+redis ## 框架简述: ### 0.本项目为多模块项目 有security模块,只有需要权限框架才需要引入该模块依赖.不然会出现没有实现类错误(已经@Autowired) #### 每个依赖security模块时候需要自定义实现类.目前有表单登入,短信验证码登入,社交登入 各种配置需要 username login:company:xxx password xxx 下列例子(以下的company是为分隔符.用于分辨登入方式,company由配置文件中读取,可以叫abc那么分隔符就是abc) ##### (1) 表单 username form:company:linenxi password 123456 --表示 表单登入账号为 linenxi ,密码为 123456 ##### (2) 验证码 username mobile:company:13587872968 password 9876 --表示 手机验证码登入手机号为 13587872968 ,验证码为 9876 ##### (3) 社交登入 username social:company:abcdefg password openId:company:wx --表示 社交登入账号为下的 abcdefg,登入方式为openId下的wx登入(也有可能有些需要开放平台下就需要用openId改为unionId,qq登入就将wx改为qq) ### 1.背景 在最基础的shiro框架加前后端不分离技术下,浏览器都会在cookie中携带sessionId,每次访问服务器都会带上sessionId访问服务器.从而达到保持会话目的 ### 2.衍生 在前后端分离技术下http请求都是无状态的 往往不采用cookie保存sessionId的方式而是用请求头中携带token.token中附带sessionId从而来保持会话目的 ### 3.最终 再基于分布式架构下,session共享就是一个最主要的难点.一种办法是tomcat内session共享,但是耗费资源.第二种就是将session储存在redis中.不管多少服务器都是先访问redis.最终达成保持会话 ### 3.1 tip:既然已经不是从服务器内的session来保持会话,那就是要重写获取session的方法.在经过源码断点之后发现最终是SessionDAO类获取session.也就是重写该类方法. ## 操作步骤 ### 1.引入pom依赖 org.crazycake shiro-redis 2.4.2.1-RELEASE ### 2.配置session获得方式 @Bean public SessionManager sessionManager() { //配置sessionId获取方式.这里用ajax请求头 MySessionManager mySessionManager = new MySessionManager(); //配置session获得方式 最终是SessionDAO类获取session会话.所以要重写 mySessionManager.setSessionDAO(sessionDAO()); return mySessionManager; } ### 3.配置sessionDAO @Bean SessionDAO sessionDAO() { log.error("使用redis缓存"); RedisSessionDAO redisSessionDAO = new RedisSessionDAO(); redisSessionDAO.setRedisManager(redisManager()); log.info("设置redisSessionDAO"); return redisSessionDAO; } ### 4.配置redisManager @Bean public RedisManager redisManager() { RedisManager redisManager = new RedisManager(); redisManager.setHost(host); redisManager.setPort(port); redisManager.setPassword(password); redisManager.setExpire(timeout);// 配置过期时间 log.info("配置redis连接设置##########" + host + ":::" + port); return redisManager; }