Spring 整合Shiro:记住我
1、登录方法
/**
* 执行登录操作
*
* @param username
* @param password
* @param rememberMe
* @param model
* @return
*/
@Log("登录")
@RequestMapping("/login")
String login(String username, String password, Boolean rememberMe, Model model) {
//判断用户名和密码为空
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
model.addAttribute("msg", "用户名和密码不能为空!");
return "login.html";
} // shiro登录步骤
// 1、获取subject对象
Subject subject = SecurityUtils.getSubject(); // 2、封装对象
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
System.out.println(token.toString()); // 3、执行登录(失败会报异常,需捕获异常)
// 实际开发中,用户名和密码错误,不给出明确提示
try {
// 设置是否记住我
rememberMe = rememberMe == null ? false : rememberMe;
// 设置记住我
token.setRememberMe(rememberMe);
// 登录
subject.login(token);
// 这样url会改变为index_v1,不然还会是login
return "redirect:/index_v1";
} catch (UnknownAccountException e) {//账号不存在
model.addAttribute("msg", "用户名不存在!");
return "/login";
} catch (LockedAccountException e) {//账户锁定
model.addAttribute("msg", "账户被锁定!");
return "/login";
} catch (IncorrectCredentialsException e) {//密码错误
model.addAttribute("msg", "密码错误!");
return "/login";
}
}
2、ShiroConfig
/**
* Copyright (C), 2018-2018, 谪仙科技有限公司
* FileName ShiroConfig
* Author wangzhiguo
* Date 2018-12-25 2:49
* Description Shiro配置
* History
* <author> <time> <version> <desc>
* wangzhiguo 2018-12-25 版本号 描述
*/
package com.itgeek.config.shiro.config; import com.itgeek.config.shiro.realm.Myrealm;
import org.apache.shiro.codec.Base64;
import org.apache.shiro.session.mgt.SessionManager;
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.SimpleCookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap;
import java.util.Map; /**
* 〈功能描述〉
* Shiro配置
* <p>
* <p>
* 系统启动,执行顺序
* realm -- > securityManager -- > filter
*
* @author wangzhiguo
* @date 2018-12-25
* @since 1.0.0
*/ @Configuration
public class ShiroConfig {
/**
* shiro核心filter
*
* @return
*/
@Bean()
public ShiroFilterFactoryBean getShiroFilterFactoryBean() {
System.out.println("Shiro过滤器");
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 设置SecurityManager(必须)
shiroFilterFactoryBean.setSecurityManager(securityManager());
/**
* shiro常用过滤器
* anon:无需认证
* authc:必须认证
* user:如果使用rememberMe功能可以直接访问
* perms:必须得到资源权限可以访问
* role:必须得到角色权限可以访问
*/
// LinkedHashMap 可以保持顺序
Map<String, String> filterMap = new LinkedHashMap<>(); // 1、认证
filterMap.put("/", "anon");
filterMap.put("/index", "anon"); filterMap.put("/toLogin", "anon");
filterMap.put("/login", "anon"); // 2、资源权限
filterMap.put("/sys/add", "perms[user:edit]");
// 3、角色权限 // 所有请求都要认证
// filterMap.put("/**", "authc");
// 认证或记住我都可以登录
filterMap.put("/**", "user");
// 未授权
shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth");
// 设置跳转的登录页
shiroFilterFactoryBean.setLoginUrl("/toLogin");
// 设置登录成功的页面
shiroFilterFactoryBean.setSuccessUrl("/index_v1");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean;
} /**
* 安全管理器
* 缓存注入在这
*
* @return
*/
@Bean()
public DefaultWebSecurityManager securityManager() {
System.out.println("Shiro安全管理器");
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置realm
securityManager.setRealm(myrealm());
// session会话
// securityManager.setSessionManager(sessionManager());
// 设置记住我
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
} /**
* realm:自定义的认证和授权逻辑
*
* @return
*/
@Bean()
public Myrealm myrealm() {
System.out.println("自定义Realm");
return new Myrealm();
} /**
* 记住我
*
* @return
*/
@Bean
public CookieRememberMeManager rememberMeManager() {
System.out.println("记住我:rememberMe");
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
//这个地方有点坑,不是所有的base64编码都可以用,长度过大过小都不行,没搞明白,官网给出的要么0x开头十六进制,要么base64
cookieRememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
return cookieRememberMeManager;
} /**
* Cookie管理
* 创建记住我cookie
*
* @return
*/
@Bean
public SimpleCookie rememberMeCookie() {
System.out.println("rememberMeCookie");
SimpleCookie cookie = new SimpleCookie("rememberMe");
cookie.setHttpOnly(true);
// 声明周期
cookie.setMaxAge(1 * 60 * 60);
return cookie;
}
}
3、登录页面
<form action="/login" method="post">
<span style="color: red" th:text="${msg}"></span>
<br>
姓名<input type="text" name="username"> <br>
密码<input type="password" name="password"> <br>
记住我<input type="checkbox" checked="checked" name="rememberMe"> <br>
<button type="submit">登录</button>
</form>
4、登录(记住我),会生成rememberMe CookIe

不记住我:rememberMe Cookie 不会生成

注销(SHiro:/logout)也会清除rememberMe Cookie
Spring 整合Shiro:记住我的更多相关文章
- Spring 整合 Shiro
一.引入依赖 <!-- spring start --> <dependency> <groupId>org.springframework</groupId ...
- Spring整合Shiro做权限控制模块详细案例分析
1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.sh ...
- Spring整合Shiro并扩展使用EL表达式
Shiro是一个轻量级的权限控制框架,应用非常广泛.本文的重点是介绍Spring整合Shiro,并通过扩展使用Spring的EL表达式,使@RequiresRoles等支持动态的参数.对Shiro的介 ...
- Spring整合Shiro 权限 角色 用户关系分析
Spring整合Shiro 权限 角色 用户关系分析 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 前置内容 之前我们学习了,使用注解的方式去完成权限的控制,当然,也是静态的,也就 ...
- spring整合shiro框架
上一篇文章已经对shiro框架做了一定的介绍,这篇文章讲述使用spring整合shiro框架,实现用户认证已经权限控制 1.搭建环境 这里不在赘述spring环境的搭建,可以简单的搭建一个ssm框架, ...
- Spring整合Shiro
apache shiro 是一个安全认证框架,和 spring security 相比,在于他使用了比较简洁易懂的 认证和授权方式.其提供的 native-session(即把用户认证后的授权信息保存 ...
- 【shiro】2.spring整合shiro,注解控制shiro用户/角色/权限And/OR,没有权限跳转到固定页面
这几天粗浅的把shiro整合到spring中,并且注解控制shiro用户/角色/权限And/OR 步骤: 1.首先maven搭建web项目 2.创建数据库 user/role/authority 其中 ...
- 【原】Spring整合Shiro基础搭建[3]
1.前言 上个Shiro Demo基础搭建是基于官方的快速入门版本,没有集成其他框架,只是简单的通过Main方法来执行Shiro工作流程,并测试一下比较核心的函数:但在企业开发中一般都会集成Sprin ...
- spring整合shiro配置BUG,Tomcat启动不了:Error during artifact deployment. See server log for details
现象 spring配置shiro权限控制之后,项目无法启动 [2019-08-09 09:00:35,800] Artifact export_web_manager:war exploded: Er ...
随机推荐
- Django配置MariaDB数据库
Django中配置MariaDB数据库.配置文件如下: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': ...
- mmap详解
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何 数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存 ...
- Git:与eclipse搭配使用
Git:与eclipse搭配使用 1)工程初始化为本地库 工程 ——>右键 ——>Team ——Share Project 在该目录下创建了本地库 这里可以设置用户签名 2)Eclipse ...
- Git:Git入门及基本命令
Git的结构: Git和代码托管中心 局域网环境下: 1)GitLab服务器 外网环境下: 2)github 3)码云 代码托管中心的任务:维护远程库 本地库和远程库的交互 团队内部协作 跨团队协作 ...
- php 中引入邮箱服务 , 利用第三方的smtp邮件服务
项目中用短信通知有时间限制,对一些频率比较大的信息力不从心. 使用邮箱发送信息是个不错的选择\(^o^)/! 首先要注册一个邮箱,在邮箱设置里开通smtp功能. 简单介绍下smtp,大概就是第三方客户 ...
- MgdDbg工具
ArxDbg是可以查看AutoCAD内部数据结构的工具,可惜是C++的.从网上找到了一个.NET版本的MgdDbg,实现的功能与C++版本的差不多. 1.运行程序,你只要右键点击AutoCAD窗口,在 ...
- Android DatePickerDialog样式不一致的问题
三星和华为的平板上,DatePickerDialog的显示样式不一致.三星的仅仅显示月日年选择框,而华为的平板上另外还显示了日历表.代码同样. 可能是系统控件做了部分改动,后来你发现是能够设置的: D ...
- [BLE--Link Layer]设备蓝牙地址
简述 不论什么网络设备而言,都会有自己独特的一个MAC地址,不然在设备量较大的情况下非常可能造成通信的混乱.蓝牙是无线通信中使用非常广泛的技术.当然其蓝牙地址也是相当的重要的了. 蓝牙地址简述 种类划 ...
- 新手村,学会做人选数 https://www.luogu.org/problemnew/show/P1036
#include<cstdio> #include<cmath> #include<string.h> using namespace std; int n,k,s ...
- Laravel-redis-订阅发布
Laravel-redis-订阅发布 标签(空格分隔): php Redis订阅发布 理解订阅发布: publish:将信息 message 发送到指定的频道 channel publish test ...
