Java 通过 Shiro 配置 RememberMe 实现记住密码功能

        Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可为任何应用提供安全保障 - 从命令行应用、移动应用到大型网络及企业应用。下面讲述一下如何实现记住密码,一般记住密码就是把用户的基本信息存入浏览器Cookie,下次登录时优先验证Cookie,后端做处理操作,依此来实现记住密码操作,而shiro中自带RememberMe功能,只需简单配置即可。


注意:对于安全性要求高的网站不建议有记住密码功能,因为Cookie是保存在本机电脑浏览器中,不排除其他用户使用该电脑,复制走Cookie,导入其他电脑继续使用该账号登录。

具体操作如下:

1、配置application-shiro.xml文件,RememberMe 配置和rememberMe管理器,具体代码如下:

<!-- remenberMe配置 -->
   <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
       <constructor-arg value="rememberMe" />
       <property name="httpOnly" value="true" />
       <!-- 默认记住7天(单位:秒) -->
       <property name="maxAge" value="604800" />
   </bean>
   <!-- rememberMe管理器 -->
   <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>

rememberMeCookie即记住我的Cookie并保存时长7天;rememberMe管理器中参数cipherKey是加密rememberMe Cookie的密钥;默认AES算法。


2、设置securityManager安全管理器的rememberMeManager,具体配置如下:

        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 
   	 	<property name="rememberMeManager" ref="rememberMeManager" />
 	</bean> 
	<bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"/> 
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
	    <property name="securityManager" ref="securityManager"/> 
	    <property name="filterChainDefinitions"> 
	       <value>
	         /login.jsp = anon
                 /authenticated.jsp = authc
                 /logout = logout
	       	 /** = user
	       </value> 
	    </property> 
	</bean>

注意:/authenticated.jsp = authc”表示访问该地址用户必须身份验证通过(Subject. isAuthenticated()==true);而“/** = user”表示访问该地址的用户是身份验证通过或RememberMe登录的都可以进行任何操作的。


3、认证MyShiroRealm.java类,是进行登录认证信息判断操作的,具体代码如下:

// 获取认证信息
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken authcToken) throws AuthenticationException {
		CaptchaUsernamePasswordToken token = (CaptchaUsernamePasswordToken) authcToken;
		String username = token.getUsername();
		if (username != null && !"".equals(username)) {
			User users = (User) en.single("from User where isDeleted=0 and name=?0",username);
			if (users != null) {
				return new SimpleAuthenticationInfo(users, users.getPassword(), getName());
			}
		}
		return null;
	}

注意:Cookie对长度是有限制的,不能全部把用户信息存储到Cookie中,不然会出现数组下表越界错误,即return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName())存入SimpleAuthenticationInfo对象时不能把所有对象信息放入其中的。

评论

  1. #2

    素文宅(2016/10/28 11:41:03)
    不错的网站主题,看着相当舒服

  2. #1

    素文宅(2016/10/14 21:02:39)
    博客做得好漂亮哦!

分享:

支付宝

微信