springboot集成shiro——登陆记住我
在shiro配置类中增加两个方法:
com.resthour.config.shrio.ShiroConfiguration
/**
* cookie管理对象
* @return
*/
@Bean
public CookieRememberMeManager cookieRememberMeManager(){
log.info("shiroConfiguration:rememberMeManager");
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
return cookieRememberMeManager;
} @Bean
public SimpleCookie rememberMeCookie(){
log.info("shiroConfiguration:rememberMeCookie");
/*这个参数是cookie的名称,对应前端页面的checkbox的name=remremberMe*/
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
/*cookie的有效时间为30天,单位秒*/
simpleCookie.setMaxAge(259200);
return simpleCookie;
}
将rememberMeCookie注入到SecurityManager中
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
/*设置realm*/
securityManager.setRealm(myShiroRealm());
/*注入缓存管理器*/
securityManager.setCacheManager(ehCacheManager());
/*注入cookie管理器*/
securityManager.setRememberMeManager(cookieRememberMeManager());
return securityManager;
}
在shiro过滤器加入记住我过滤器
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
log.info("ShiroFilterFactoryBean 实例化");
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/logout", "logout");
/*匿名可以访问的地址*/
filterChainDefinitionMap.put("/favicon.ico", "anon");
filterChainDefinitionMap.put("/user/tologin", "anon"); /*配置记住我或认证通过可以访问的地址*/
filterChainDefinitionMap.put("/user/index", "user");
filterChainDefinitionMap.put("/", "user");
/*所有路径必须授权访问,且必须放在最后*/
filterChainDefinitionMap.put("/**", "authc");
/*登陆提交地址*/
shiroFilterFactoryBean.setLoginUrl("/user/login");
/*验证通过可以访问的地址*/
shiroFilterFactoryBean.setSuccessUrl("/user/index");
/*访问没有授权的资源*/
shiroFilterFactoryBean.setUnauthorizedUrl("/403"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean;
}
然后在登陆页面加入多选框记住我,关键name的值必须和shiro配置类中参数一致
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆页面</title>
</head>
<body>
错误信息:<h4 th:text="${msg}"></h4>
<form action="/user/login" method="post">
<p>帐号:<input type="text" name="username" value="admin"></p>
<p>密码:<input type="text" name="password" value="1234"></p>
<p><input type="submit" value="登陆"><input type="checkbox" name="rememberMe">记住我</p>
</form> </body>
</html>
最后附上完整的shiro配置类
package com.resthour.config.shrio; import com.resthour.realm.MyShiroRealm;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
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.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap;
import java.util.Map; /**
* shiro配置类
*
* @author baobao
* @date 2018-04-01 14:48
*/
@Configuration
@Slf4j
public class ShiroConfiguration { @Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
log.info("ShiroFilterFactoryBean 实例化");
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/logout", "logout");
/*匿名可以访问的地址*/
filterChainDefinitionMap.put("/favicon.ico", "anon");
filterChainDefinitionMap.put("/user/tologin", "anon"); /*配置记住我或认证通过可以访问的地址*/
filterChainDefinitionMap.put("/user/index", "user");
filterChainDefinitionMap.put("/", "user");
/*所有路径必须授权访问,且必须放在最后*/
filterChainDefinitionMap.put("/**", "authc");
/*登陆提交地址*/
shiroFilterFactoryBean.setLoginUrl("/user/login");
/*验证通过可以访问的地址*/
shiroFilterFactoryBean.setSuccessUrl("/user/index");
/*访问没有授权的资源*/
shiroFilterFactoryBean.setUnauthorizedUrl("/403"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean;
} @Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
/*设置realm*/
securityManager.setRealm(myShiroRealm());
/*注入缓存管理器*/
securityManager.setCacheManager(ehCacheManager());
/*注入cookie管理器*/
securityManager.setRememberMeManager(cookieRememberMeManager());
return securityManager;
} /**
* 自定义realm
* @return
*/
@Bean
public MyShiroRealm myShiroRealm() {
MyShiroRealm myShiroRealm = new MyShiroRealm();
return myShiroRealm;
} /**
* 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证
* 配置以下两个bean(DefaultAdvisorAutoProxyCreator和AuthorizationAttributeSourceAdvisor)即可实现此功能
* @return
*/
@Bean
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
} /**
* 开启aop注解支持
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
} /**
* 缓存管理对象
* @return
*/
@Bean
public EhCacheManager ehCacheManager(){
EhCacheManager ehCacheManager = new EhCacheManager();
ehCacheManager.setCacheManagerConfigFile("classpath:config/ehcache-shiro.xml");
return ehCacheManager;
} /**
* cookie管理对象
* @return
*/
@Bean
public CookieRememberMeManager cookieRememberMeManager(){
log.info("shiroConfiguration:rememberMeManager");
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
return cookieRememberMeManager;
} @Bean
public SimpleCookie rememberMeCookie(){
log.info("shiroConfiguration:rememberMeCookie");
/*这个参数是cookie的名称,对应前端页面的checkbox的name=remremberMe*/
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
/*cookie的有效时间为30天,单位秒*/
simpleCookie.setMaxAge(259200);
return simpleCookie;
} }
springboot集成shiro——登陆记住我的更多相关文章
- SpringBoot集成Shiro 实现动态加载权限
一.前言 本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 . 按钮 .ur ...
- SpringBoot学习笔记(五):SpringBoot集成lombok工具、SpringBoot集成Shiro安全框架
SpringBoot集成lombok工具 什么是lombok? 自动生成setget方法,构造函数,打印日志 官网:http://projectlombok.org/features/index. 平 ...
- SpringBoot集成Shiro并用MongoDB做Session存储
之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...
- springboot集成shiro实现权限认证
github:https://github.com/peterowang/shiro 基于上一篇:springboot集成shiro实现身份认证 1.加入UserController package ...
- SpringBoot集成Shiro安全框架
跟着我的步骤:先运行起来再说 Spring集成Shiro的GitHub:https://github.com/yueshutong/shiro-imooc 一:导包 <!-- Shiro安全框架 ...
- springboot集成shiro 实现权限控制(转)
shiro apache shiro 是一个轻量级的身份验证与授权框架,与spring security 相比较,简单易用,灵活性高,springboot本身是提供了对security的支持,毕竟是自 ...
- 【Shiro】SpringBoot集成Shiro
项目版本: springboot2.x shiro:1.3.2 Maven配置: <dependency> <groupId>org.apache.shiro</grou ...
- SpringBoot集成Shiro实现权限控制
Shiro简介 Apache Shiro是一个功能强大且易于使用的Java安全框架,用于执行身份验证,授权,加密和会话管理.使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移 ...
- springboot 集成shiro
首先看下shiro configuration 的配置,重要部分用红色标出了 package cn.xiaojf.today.shiro.configuration; import at.pollux ...
随机推荐
- Beginning Python Chapter 3 Notes
变量(variable)是储存数据的实体,在Python中也被称为"名称"(name). 1.Python"名称"基本命名法则 1.1) "名称&qu ...
- Outlook Web App 客户端超时设置
这篇文章我们讨论一下,OWA 2013在公共和私人的电脑是如何启用和配置. Exchange 2013 Outlook Web App (OWA) 登录页不再允许用户选择无论他们正在使用公共的或私人的 ...
- HDU 5501 The Highest Mark (贪心+DP,经典)
题意: 有n道题目,每道题目的初始分数为Ai,分数每分钟减少Bi,完成此题需要Ci分钟,问在t分钟内最多能获得多少分? 思路: 好题~ 如果没有B的话,就是一道裸的01背包的题目了.每道题目的得分为: ...
- POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
题意: 给一个n*m的矩阵,每个格子中有'P'或者'H',分别表示平地和高原,平地可以摆放大炮,而大炮的攻击范围在4个方向都是2格(除了自身位置),攻击范围内不能有其他炮,问最多能放多少个炮?(n&l ...
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur
屠龙宝刀点击就送 Tarjan缩点+拓扑排序 以后缩点后建图看n范围用vector ,或者直接用map+vector 结构体里数据要清空 代码: #include <cstring> #i ...
- BZOJ 4777: [Usaco2017 Open]Switch Grass
4777: [Usaco2017 Open]Switch Grass Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 46 Solved: 10[Su ...
- UVA 1613 K-Graph Oddity K度图着色 (构造)
题意:在一个n个点的无向连通图中,n是奇数,k是使得所有点的度数不超过k的最小奇数,询问一种染色方案,使得相邻点的颜色不同. 题解:一个点和周围的点的颜色数加起来最大为它的度数+1:如果最大度数是偶数 ...
- UVA 1600 Patrol Robert 巡逻机器人 (启发搜索BFS)
非常适合A*的一道题. 比普通的迷宫问题加一个信息k表示当前穿过的障碍物的数量. #include<cstdio> #include<cstring> #include< ...
- C++内联函数、宏定义和普通函数的区别
C++内联函数.宏定义和普通函数的区别? 宏定义:在预处理阶段进行简单的文本替换,不会进行参数类型检查: 内联函数:在编译器的时候进行代码插入,编译器会在每次调用内联函数的地方直接将内联函数的内容展开 ...
- c++作业:输入两个整数,用函数求两数之和。函数外部声明有什么作用?
#include <iostream> using namespace std; int main(){ //求两数的和? int a,b,s; cout<<"请你输 ...