原创

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对象时不能把所有对象信息放入其中的。

~阅读全文-人机检测~

微信公众号“Java精选”(w_z90110),专注Java技术干货分享!让你从此路人变大神!回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。微信搜索小程序“Java精选面试题”,内涵3000+道Java面试题!

涵盖:互联网那些事、算法与数据结构、SpringMVC、Spring boot、Spring Cloud、ElasticSearch、Linux、Mysql、Oracle等

评论

分享:

支付宝

微信