几乎所有网站都有“记住我”功能,其原理无非就是username、password加密后放在cookie中,并设定过期时间,访问相关页面时,再从cookie中取出和库中对比,符合则放行继续访问,不符合则跳转到登陆页面。
今天给博客后台增加记住我功能,后台权限用的shiro,正好可以拿来用。非常简单,代码几乎没动,只是修改了shiro.ini文件。
首先是开启rememberMe功能,只需UsernamePasswordToken(username, password,true)即可,true表示开启,false表示关闭,代码如下:
public class ShiroAuthenticationToken extends UsernamePasswordToken { private static final long serialVersionUID = 9130307801958437047L; private String captcha; public ShiroAuthenticationToken(String username, String password, String captcha, boolean rememberMe) { super(username, password, rememberMe); this.captcha = captcha; } public String getCaptcha() { return captcha; } public void setCaptcha(String captcha) { this.captcha = captcha; } }
我这里通过继承增加了验证码功能。
然后就是修改shiro.ini,如下:
#rememberMe30天 rememberMeCookie=org.apache.shiro.web.servlet.SimpleCookie rememberMeCookie.maxAge=2592000 rememberMeCookie.name=rememberMe rememberMeManager=org.apache.shiro.web.mgt.CookieRememberMeManager securityManager.rememberMeManager=$rememberMeManager securityManager.rememberMeManager.cipherKey=kPH+bIxk5D2deZiIxcaaaA== securityManager.rememberMeManager.cookie=$rememberMeCookie
这样就完成了,是不是很简单。
还有一种情况,通过记住我再次访问网站时,在提交订单时会弹出登陆页面让重新登录,使用shiro实现这种功能也很简单。
SecurityUtils.getSubject().isAuthenticated()表示通过输入账号密码正常登陆的,即使用subject.login(token);登陆。
SecurityUtils.getSubject().isRemembered()表示通过记住我登陆的,并没有出现输入账号密码页面。
所以,访问一般页面,我们只如下判断:
Subject subject = SecurityUtils.getSubject(); if (subject.isRemembered()||subject.isAuthenticated()) { //做一些不太重要的操作 }
访问特殊页面,我们需要判断是否通过输入账号密码登陆的:
Subject subject = SecurityUtils.getSubject(); if (subject.isAuthenticated()) { //做一些重要的操作 }