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