目录

  • 前言
  • 更换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功能实现相关推荐

  1. spring security 学习三-rememberMe

    spring security 学习三-rememberMe 功能:登录时的"记住我"功能 原理: rememberMeAuthenticationFilter在security过 ...

  2. java shiro 访问频率_java shiro配置记住密码功能 RememberMe

    一般来讲,记住密码的基本处理,就是把用户的一些基本信息(密码)存入浏览器的Cookie,下次登录的时候优先验证Cookie,后端做处理:以此来实现记住密码的功能!使用shiro自带的RememberM ...

  3. SpringBoot+Shiro学习(八):RememberMe

    这一章比较简单,就不多说了,上代码: /** * cookie对象; * rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cookie的有效时间等等. ...

  4. Shiro的 rememberMe 功能使用指导(为什么rememberMe设置了没作用?)

    问题 shiro中提供了rememberMe功能,它用起来是这样的 UsernamePasswordToken token = new UsernamePasswordToken(loginForm. ...

  5. [shiro] - 加入rememberMe功能

    shiro不加入rememberMe没事,一加入就出错. RememberMeAuthenticationToken : public interface RememberMeAuthenticati ...

  6. Shiro 实现 RememberMe 功能

    本文内容:Shiro 中RememberMe 功能的介绍以及实现. 1 介绍 Shiron 提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你 ...

  7. Shiro实现单一登录,并保留使用RememberMe功能。

    Shiro提供的功能结构图: Shiro详细的架构: Shiro中的各类过滤器 Filter Name Class anon org.apache.shiro.web.filter.authc.Ano ...

  8. 记住我remember-me功能的几种实现方式

    本文讨论几种记住我功能的实现方式. 原理:用户登录后,服务端为用户生成一个Token,并放入客户端Cookie中.下次用户登录,服务端验证Cookie中的Token并自动登录. 简单的Token生成方 ...

  9. shiro利用mysql动态授权_SpringBoot+Shiro学习之数据库动态权限管理和Redis缓存

    发现问题,需找解决思路. 之前我们整合Shiro,完成了登录认证和权限管理的实现,登录认证没什么说的,需要实现AuthorizingRealm中的doGetAuthenticationInfo方法进行 ...

最新文章

  1. 《信息安全研究》数据安全专刊研讨会召开
  2. 人脸识别引爆下一代生物支付四军之战
  3. H.264的一些资料整理
  4. OpenCV 绘制几何图形
  5. Docker:使用本地卷和tmpfs挂载
  6. 收藏 | 9 个技巧让你的 PyTorch 模型训练变得飞快!
  7. 还不会python面相对象?活该单身(面向对象基础+交互关系)
  8. OSPF区域外路由的计算过程与FA值实验
  9. php7.1 win7,win7 配置AMP环境(apache2.4.39 + php7.1.28)
  10. pta mysql训练题集 (221-240)
  11. chrome浏览器糟糕WEBGL遇到了问题,如何解决
  12. SourceTree这是一个无效源路径(更改git账号和密码导致无效源路径看这里)
  13. 4-5. do...while循环
  14. 放大镜原理分析及jquery实现
  15. 计算机导论——计算机软件03
  16. Java实现字典树 Trie
  17. 【科普】1分钟帮你搞懂机械硬盘和固态硬盘
  18. 低成本DC/DC转换器34063的应用(图)
  19. VMware虚拟机安装Linux教程
  20. SX1268 SX1262中文数据手册

热门文章

  1. Linux服务器配置与管理(基于Centos7.2)任务目标(三)
  2. 企业微信如何批量添加好友、导入客户联系人的微信?
  3. 适用于医生辞职的报告格式范文(共计6篇)
  4. 前端开发真的没有后端工资高?
  5. 【自动控制原理_B站网课笔记】控制系统的结构图
  6. python显卡利用率_python-如何查找AMD显卡数据
  7. distinct之后,如何查询所有字段
  8. Java线上应用故障排查之二:高内存占用
  9. 云计算、大数据和 AI
  10. 95%的区块链从业者将离开,80%的矿场将倒闭,行业大寒来临