三.shiro:remember me

访问地址:

搭建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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值