shiro的rememberMe配置

几乎所有网站都有“记住我”功能,其原理无非就是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()) {
			//做一些重要的操作
		}


蚩蚩桑葚

Share this article