Shiro学习之RememberMe功能实现
目录
- 前言
- 更换MySQL数据库
- 一、更换依赖
- 二、更改配置
- 三、改换建表语句
- Shiro的配置
- 控制层的改进
- 实际展示
- 咨询请找
前言
在网上看了一个开源的springboot项目,上面有非常全的springboot结合各种框架的配置,其中就有shiro,于是拿过来研究!
地址:https://github.com/wuyouzhuguli/SpringAll,从11开始看!他的项目里用的是Oracle数据库,如果你是MySQL数据库需要做对应的更换!
maven阿里云镜像下载不了Oracle的依赖,所以你需要自己准备对应jar包install本地!
更换MySQL数据库
一、更换依赖
<!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>
二、更改配置
spring:datasource:druid:# 数据库访问配置, 使用druid数据源 type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNullusername: rootpassword: 123456
三、改换建表语句
他的Oracle建表语句并不能在MySQL里面直接用,因为类型都不匹配,不过这个并不是大问题,我这里贴上SQL
CREATE TABLE `t_user` (`id` int(20) NOT NULL,`username` varchar(255) DEFAULT NULL,`passwd` varchar(255) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`status` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
上几条数据:
INSERT INTO T_USER VALUES ('2', 'test', '7a38c13ec5e9310aed731de58bbc4214', TO_DATE('2017-11-19 17:20:21', 'YYYY-MM-DD HH24:MI:SS'), '0');
INSERT INTO T_USER VALUES ('1', 'mrbird', '42ee25d1e43e9f57119a00d0a39e5250', TO_DATE('2017-11-19 10:52:48', 'YYYY-MM-DD HH24:MI:SS'), '1');
这里密码是使用MD5盐值加密,代码请看util包下的加密工具,伪造数据这种事我就不详细说了!
Shiro的配置
当然这里我只贴核心代码,其余需要说明的地方请各位仔细看注释
,有任何不懂得都可以留言或者进群交流!
import java.util.LinkedHashMap;import org.apache.shiro.codec.Base64;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.Cookie;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.springboot.shiro.ShiroRealm;@Configuration
public class ShiroConfig {@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);shiroFilterFactoryBean.setLoginUrl("/login");shiroFilterFactoryBean.setSuccessUrl("/index");shiroFilterFactoryBean.setUnauthorizedUrl("/403");LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();filterChainDefinitionMap.put("/css/**", "anon");filterChainDefinitionMap.put("/js/**", "anon");filterChainDefinitionMap.put("/fonts/**", "anon");filterChainDefinitionMap.put("/img/**", "anon");filterChainDefinitionMap.put("/druid/**", "anon");filterChainDefinitionMap.put("/logout", "logout");filterChainDefinitionMap.put("/", "anon");filterChainDefinitionMap.put("/**", "user");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;}@Bean public SecurityManager securityManager(){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(shiroRealm());//rememberMeManager添加到管理器里面securityManager.setRememberMeManager(rememberMeManager());return securityManager; } /*** @Description: 可见 LifecycleBeanPostProcessor 就是通过上述三个方法对Initializable和* Destroyable这两个类的init方法和destroy方法进行内部调用来实现bean 的生命周期控制* @Param:* @return:* @Author: 朝花不迟暮* @Date: 2020/10/26*/@Bean(name = "lifecycleBeanPostProcessor")public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {return new LifecycleBeanPostProcessor();}@Bean public ShiroRealm shiroRealm(){ ShiroRealm shiroRealm = new ShiroRealm(); return shiroRealm; } /*** cookie对象* @return*/public SimpleCookie rememberMeCookie() {// 设置cookie名称,对应login.html页面的<input type="checkbox" name="rememberMe"/>SimpleCookie cookie = new SimpleCookie("rememberMe");// 设置cookie的过期时间,单位为秒,这里为一天cookie.setMaxAge(86400);return cookie;}/*** cookie管理对象* @return*/public CookieRememberMeManager rememberMeManager() {CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();cookieRememberMeManager.setCookie(rememberMeCookie());// rememberMe cookie加密的密钥 cookieRememberMeManager.setCipherKey(Base64.decode("3AvVhmFLUs0KTA3Kprsdag=="));return cookieRememberMeManager;}}
其实核心代码并不是很多,我这里也没有给全,像和数据库关联的dao层和业务相关的service层我是直接略过了,因为这并不是我们要说的话题。
控制层的改进
在他的源代码里虽然做了rememberMe
功能,但是并没有在业务逻辑上体现出来,仅仅只是设置了一个cookies,我自己在他的基础上将这个功能实现出来,也不是很难!
@GetMapping("/login")public String login(HttpServletRequest req) {Cookie[] cookies = req.getCookies();boolean rememberMe = false;for (Cookie cookie : cookies){if(cookie.getName().equals("rememberMe")){System.out.println(cookie.getName().equals("rememberMe"));rememberMe = cookie.getName().equals("rememberMe");break;}}if(rememberMe){return "redirect:index";}System.out.println(rememberMe);return "login";}
其思路就是在跳转到登陆页的时候判断cookies里面是否有rememberMe
,如果有说明这个用户之前已经登录过了那么就重定向到首页,反之则跳到登录页!
实际展示
浏览器输入:http://localhost:8080/web/login
输入 用户名:admin
,密码:123456
,点击记住我,这样浏览器上就有你的cookies
只要你不注销,你就可以直接进入首页,即使进入登录页也会重定向到首页!
咨询请找
QQ:707409741
群:118767976
Shiro学习之RememberMe功能实现相关推荐
- spring security 学习三-rememberMe
spring security 学习三-rememberMe 功能:登录时的"记住我"功能 原理: rememberMeAuthenticationFilter在security过 ...
- java shiro 访问频率_java shiro配置记住密码功能 RememberMe
一般来讲,记住密码的基本处理,就是把用户的一些基本信息(密码)存入浏览器的Cookie,下次登录的时候优先验证Cookie,后端做处理:以此来实现记住密码的功能!使用shiro自带的RememberM ...
- SpringBoot+Shiro学习(八):RememberMe
这一章比较简单,就不多说了,上代码: /** * cookie对象; * rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cookie的有效时间等等. ...
- Shiro的 rememberMe 功能使用指导(为什么rememberMe设置了没作用?)
问题 shiro中提供了rememberMe功能,它用起来是这样的 UsernamePasswordToken token = new UsernamePasswordToken(loginForm. ...
- [shiro] - 加入rememberMe功能
shiro不加入rememberMe没事,一加入就出错. RememberMeAuthenticationToken : public interface RememberMeAuthenticati ...
- Shiro 实现 RememberMe 功能
本文内容:Shiro 中RememberMe 功能的介绍以及实现. 1 介绍 Shiron 提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你 ...
- Shiro实现单一登录,并保留使用RememberMe功能。
Shiro提供的功能结构图: Shiro详细的架构: Shiro中的各类过滤器 Filter Name Class anon org.apache.shiro.web.filter.authc.Ano ...
- 记住我remember-me功能的几种实现方式
本文讨论几种记住我功能的实现方式. 原理:用户登录后,服务端为用户生成一个Token,并放入客户端Cookie中.下次用户登录,服务端验证Cookie中的Token并自动登录. 简单的Token生成方 ...
- shiro利用mysql动态授权_SpringBoot+Shiro学习之数据库动态权限管理和Redis缓存
发现问题,需找解决思路. 之前我们整合Shiro,完成了登录认证和权限管理的实现,登录认证没什么说的,需要实现AuthorizingRealm中的doGetAuthenticationInfo方法进行 ...
最新文章
- 代数拓扑的数学方法正在变革脑科学
- 【nginx学习一】基本原理初探
- 如果当初你爱的再狠一点
- python多线程爬取斗图啦数据
- Scala教程之:可变和不变集合
- [SpecialJudge]构造“神秘“字符串(洛谷P3742题题解,Java语言描述)
- 安卓案例:注册用户免启动时的广告页面
- WinForm高级控件实例--职员信息登记
- 深度学习TF—13.对抗生成网络—GAN
- 如何设置tomcat定时自动重启
- JavaScript面向对象编程之双向链表结构实现立体轮播图效果
- php网站 视频马赛克,如何给视频加马赛克 菜鸟也能学会的视频加马赛克解决方案...
- 这将是你看到过最全的pdf预览解决方案
- Linux下基于LDAP统一用户认证的研究
- C# 第五章『面向对象』◆第9节:抽象类和密封类
- JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
- Java初学者作业——定义客户类(Customer),客户类的属性包括:姓名、年龄、电话、余额、账号和密码;方法包括:付款。
- 论文阅读>污垢检测:Vision-Based Dirt Detection and Adaptive Tiling Scheme for Selective Area Coverage
- Python tkinter 设置主题
- Wifi热点java_Wifi热点实现文件传输
热门文章
- qt实现撤销和恢复功能
- CorelDRAW 2019.0安装教程(带安装包)
- 建筑识图入门(初学者 入门)
- 计蒜客T1233 书架
- SQL查询重复数据,只显示一条sql语句
- TVM学习(七)记录 在开发板上布置VTA (RPC 服务器的构建)
- Cesium中用到的图形技术——Computing the horizon occlusion point
- 统计个位数字 (本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3)
- Buffalo LS-QVL安装+配置信息
- Android wpa_supplicant源码分析---nl80211内核通信Generic Netlink