所谓记住我功能,就是登陆之后,浏览器关闭,再次访问不需要再登陆。记住我功能主要是利用Cookie来实现的。Shiro提供了记住我(RememberMe)的功能,实现也比较简单
本文在上一篇文章( Shrio功能应用(一)–登陆验证(源码)以及权限执行过程)代码基础进行添加记住我功能。
代码实现:
代码地址:
https://github.com/OooooOz/SpringBoot-Shiro
前台页面、控制器、成功跳转页面代码都不变
ShiroConfig的Shiro过滤器:
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
... ... ... ...
//其他资源都需要认证 authc 表示需要认证才能进行访问 user表示配置记住我或认证通过可以访问的地址
// perms.put("/*", "authc");
perms.put("/*", "user");
... ... ... ...
return shiroFilterFactoryBean;
}
ShiroConfig的安全管理器SecurityManager:
@Bean(name="securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("shiroRealm") MyShiroRealm shiroRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(shiroRealm);
securityManager.setRememberMeManager(rememberMeManager()); //实现记住我
return securityManager;
}
ShiroConfig的记住我新增配置:
/**
* FormAuthenticationFilter 过滤器 过滤记住我
*/
@Bean
public FormAuthenticationFilter formAuthenticationFilter(){
FormAuthenticationFilter formAuthenticationFilter = new FormAuthenticationFilter();
formAuthenticationFilter.setRememberMeParam("rememberMe"); //对应前端的checkbox的name = rememberMe,默认值是rememberMe
return formAuthenticationFilter;
}
/**
* cookie管理对象;记住我功能,rememberMe管理器
*/
@Bean
public CookieRememberMeManager rememberMeManager(){
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
//rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
cookieRememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
return cookieRememberMeManager;
}
/**
* cookie对象;会话Cookie模板 ,默认为: JSESSIONID 问题: 与SERVLET容器名冲突,重新定义为sid或rememberMe,自定义
*/
@Bean
public SimpleCookie rememberMeCookie(){
//这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
simpleCookie.setHttpOnly(true); //设为true后,只能通过http访问,javascript无法访问,防止xss读取cookie
simpleCookie.setPath("/");
simpleCookie.setMaxAge(60); //记住我cookie生效时间1min ,单位秒,-1 表示浏览器关闭时失效此 Cookie;
return simpleCookie;
}
功能测试:
访问http://localhost:8080/userList.do,跳转登陆页面,登陆成功后,关闭浏览器,再重新访问http://localhost:8080/userList.do,直接跳转到成功的页面,不会重新登陆。60s过后重新打开浏览器访问,有需要重新登陆。
重新访问时,可以查看浏览器,会记录有Cookie信息:
后台控制台输出,显示subject.isRemembered()的结果为true。
参考文章:
springboot整合shiro-配置记住我(四)