首先说一下rememberMe是什么,
通俗的说就是 你登录百度以后,选择记住我,关闭浏览器之后打开百度,发现你还是登录状态,这样就是RememberMe
在这里,我们假设已经实现了shiro的基本登录功能。
首先是页面
userNametype="text"id="userName" name="userName"value=" " />
password:type="text" id="password" name="password" value="${user.password}"/>
下次自动登录:"checkbox"id="rememberMe"name="rememberMe" value="true"/>
type="button" id="login" value="login"/>"red"/>${error}
再其次 需要配置Spring-shiro.xml
<bean id="sessionIdCookie"class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="sid"/>
<property name="httpOnly" value="true"/>
<property name="maxAge" value="-1"/>
bean>
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="rememberMe"/>
<property name="httpOnly" value="true"/>
<property name="maxAge" value="2592000"/>
bean>
sessionIdCookie:maxAge=-1表示浏览器关闭时失效此Cookie;
rememberMeCookie:即记住我的Cookie,保存时长30天;
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>
<property name="cookie" ref="rememberMeCookie"/>
bean>
rememberMe管理器,cipherKey是加密rememberMe Cookie的密钥;默认AES算法;
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="rememberMeManager" ref="rememberMeManager"/>
<property name="realm" ref="myRealm"/>
bean>
设置securityManager安全管理器的rememberMeManager;securityManager可以实现自己的relam
<bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
<property name="usernameParam" value="userName"/>
<property name="passwordParam" value="password"/>
<property name="rememberMeParam" value="rememberMe"/>
<property name="loginUrl" value="/login"/>
bean>
在html里定义,rememberMeParam,即rememberMe请求参数名,请求参数是boolean类型,true表示rememberMe。默认是false
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="login"/>
<property name="unauthorizedUrl" value="unauthorizedUrl"/>
<property name="filterChainDefinitions">
<value>
/login=anon
/index=anon
/main=user
/left=user
/userMange=authc
/js/commom/*.*=anon
value>
property>
bean>
“/userMange= authc”表示访问该地址用户必须身份验证通过(Subject. isAuthenticated()==true);而“/main = user”表示访问该地址的用户是身份验证通过或RememberMe登录的都可以。/login=anon表示所有人都能访问
Subject subject = SecurityUtils.getSubject();
// 用户输入的账号和密码,,存到UsernamePasswordToken对象中..然后由shiro内部认证对比,
// 认证执行者交由ShiroDbRealm中doGetAuthenticationInfo处理
// 当以上认证成功后会向下执行,认证失败会抛出异常
UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
try {
if(rememberMe){
token.setRememberMe(true);
}else {
token.setRememberMe(false);
}
subject.login(token);
} catch (LockedAccountException lae) {
token.clear();
request.setAttribute("error", "用户已经被锁定不能登录,请与管理员联系!");
return "login";
}
JAVA层,设置rememberMe。
subject.isRemembered():记住用户后会保存cookie,但是登录的时候可能不是真的你,能用你浏览器的都能打开,像/main=user这种权限都能打开。
subject.isAuthenticated():表示用用户名密码登录的用户,像/userMange=authc都能打开。
像平常权限的网页 建议设置成=user 但是像牵扯到安全事务的比如修改密码之类的 就要设置成=authc
authc拦截器会判断用户是否是通过Subject.login(isAuthenticated()==true)登录的,如果是才放行,否则会跳转到登录页面叫你重新登录。