访问地址:
搭建1:https://blog.csdn.net/u014203449/article/details/79330811
搭建2:https://blog.csdn.net/u014203449/article/details/79331417
访问地址地址:点击打开链接 http://47.98.153.30:8080/ 账号:melo 密码:12345678
github地址:点击打开链接https://github.com/MeloFocus/focus
举个栗子:登录淘宝,关闭浏览器,再打开浏览器淘宝页面,发现已经登录了,可以浏览,但进入我的订单会提示再次登录。就是remember me 功能
1.配置记住我管理器,将cookie管理器注入其中
@Bean
public SimpleCookie rememberMeCookie(){
System.out.println("ShiroConfiguration.rememberMeCookie()");
//这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
//<!-- 记住我cookie生效时间30天 ,单位秒;-->
simpleCookie.setMaxAge(259200);
return simpleCookie;
}
/**
* cookie管理对象;
* @return
*/
@Bean
public CookieRememberMeManager rememberMeManager(){
System.out.println("ShiroConfiguration.rememberMeManager()");
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
return cookieRememberMeManager;
}
2.将记住我管理器注入安全管理器
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置realm.
securityManager.setRealm(myShiroRealm());
//将缓存注入安全管理器,就不会反复执行 realm的授权方法了;只要实现了shiro的cache接口、CacheManager接口就可以用来注入安全管理器
//shiro自带的一个内存缓存,本质是hashmap,MemoryConstrainedCacheManager(),试验没问题,非常轻,简单的登录用这个
//securityManager.setCacheManager(new MemoryConstrainedCacheManager());
//用了redis缓存注入安全管理器,会报一个序列化失败的错误,推测是new SimpleAuthenticationInfo 时 user对象无法序列化,加上序列化就好了
securityManager.setCacheManager(cacheManager());
//将session托管给redis,nigix试验分布式,确实 做到了session共享
securityManager.setSessionManager(SessionManager());
//注入记住我管理器;
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}
3.当访问指定路径资源时,只需要记录我就能访问,则在ShiroFilterFactoryBean添加记住我过滤器:user
如果一个url已经设置过了anno或authc 就不要再次设置
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
省略。。
// 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边
// <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问;user:remember me的可以访问-->
filterChainDefinitionMap.put("/fine", "user");
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
System.out.println("Shiro拦截器工厂类注入成功");
return shiroFilterFactoryBean;
}
4.创建Token后,加上token.setRememberMe(true)
String account=user.getLoginName();
String password=user.getPassword();
UsernamePasswordToken token = new UsernamePasswordToken(account,password,false);
token.setRememberMe(true);
Subject currentUser = SecurityUtils.getSubject();
try {
currentUser.login(token);
//此步将 调用realm的认证方法
} catch(IncorrectCredentialsException e){
//这最好把 所有的 异常类型都背会
model.addAttribute("message", "密码错误");
return "login";
} catch (AuthenticationException e) {
model.addAttribute("message", "登录失败");
return "login";
}
登录后可以看到有个name是rememberMe 的cookie