Shiro 实现记住我功能

登录一些网站的时候,在登录输入框的下侧一般都会有一个“记住我”的勾选框,选择之后,下次进入网站时就会自动进行登录操作,无需我们再次输入密码。

 

有关“记住我”的实现原理如下:

1、首先在登录页面选中“记住我”然后登录成功;如果是浏览器登录,一般会把“记住我”的Cookie写到客户端并保存下来。

2、关闭浏览器再重新打开,会发现浏览器还是记住你的。

3、访问一般的网页服务器端还是知道你是谁,且能正常访问。

Shiro提供了登录时的“认证”操作,同时也提供了“记住我”的操作实现,有何区别?

1)subject.isAuthenticated()

        表示用户进行了身份验证登录的,即使用Subject.login进行了登录;

2)subject.isRemembered()

        表示用户是通过“记住我”登录的,此时可能并不是真正的你(如其他人使用你的电脑,或者你的cookie被窃取)在访问的;

两者二选一,即subject.isAuthenticated()==true,则subject.isRemembered()==false;反之一样。

 

一、演示 记住我 功能

1、登录页面:

	<form action="${pageContext.request.contextPath }/login" method="post" id="loginForm" >
		用户名:<input type="text" name="username"><br>
		密    码:<input type="password" name="pazzword" id="pazzword"><br>
		<input type="checkbox" name="rememberme" value="1"> 记住我7天<br>
		<button type="button" onclick="checkForm()">登录</button>
	</form>

2、action 登录方法:token.setRememberMe(true);

	@PostMapping("/login")
	public String login(User user, HttpSession session, Integer rememberme) {
		//使用 shiro 登录验证
		//1 认证的核心组件:获取 Subject 对象
		Subject subject = SecurityUtils.getSubject();
				
		//2 将登陆表单封装成 token 对象
		UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPazzword());
		//开启记住我功能
		if(rememberme != null && rememberme == 1) {
			token.setRememberMe(true);
		}
		try {
			//3 让 shiro 框架进行登录验证:
			subject.login(token);
		} catch (Exception e) {
			e.printStackTrace();
			return "loginError";
		}
		return "redirect:/admin/index";
	}

3、在 spring.xml 里的配置 shiro 的核心组件bean中配置 cookie 失效时间

	<!-- 配置 shiro 的核心组件:securityManager -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<!-- 配置缓存 -->
        <property name="cacheManager" ref="cacheManager"/> 
        <property name="authenticator" ref="authenticator"></property> 
        <!-- 配置域realm,用户名,密码,角色都保存在域里:实现从数据库中获取用户信息,需要我们自己创建一个类(实现Realm接口) -->
        <property name="realms">
        	<list>
        		<ref bean="shiroRealm"/>
        		<ref bean="weixinRealm"/>
        		<ref bean="qqRealm"/>
        	</list>
        </property>
        <!-- cookie 7天,单位:秒。也采用spring el表达式来计算 -->
        <!-- <property name="rememberMeManager.cookie.maxAge" value="604800"></property> -->
        <property name="rememberMeManager.cookie.maxAge" value="#{7 * 24 * 60 * 60}"/>    </bean>

    跟踪一下 rememberMeManager 属性:

     

      

       

4、运行项目登录访问即可:

注意:

1)要实现记住我功能,必须将管理的model对象实现可序列化(implements Serializable)。

2)在athc过滤配置之前,能够通过记住我访问的页面要配置user过滤器。

    

 

end ~

 

 

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shiro实现记住我的功能,需要进行以下步骤: 1. 在Shiro配置文件中,开启cookie管理器和记住功能。具体配置如下: ``` # 开启cookie管理器 securityManager.sessionManager.sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO securityManager.sessionManager.sessionIdCookieEnabled = true securityManager.sessionManager.sessionIdCookie = org.apache.shiro.web.servlet.SimpleCookie # 开启记住功能 securityManager.rememberMeManager = org.apache.shiro.web.mgt.CookieRememberMeManager securityManager.rememberMeManager.cookie = org.apache.shiro.web.servlet.SimpleCookie securityManager.rememberMeManager.cookie.name = rememberMe securityManager.rememberMeManager.cipherKey = 4AvVhmFLUs0KTA3Kprsdag== ``` 2. 在用户登录时,如果用户选择记住功能,则创建一个RememberMeCookie,并设置它的属性,如下: ``` if (rememberMe) { Cookie rememberMeCookie = new SimpleCookie("rememberMe"); rememberMeCookie.setMaxAge(7 * 24 * 60 * 60); // 设置cookie过期时间为一周 rememberMeCookie.setHttpOnly(true); rememberMeCookie.setValue("加密后的记住我信息"); response.addCookie(rememberMeCookie); } ``` 其中,加密后的记住我信息可以使用Shiro提供的RememberMeManager进行加密。 3. 在Shiro的过滤器链中,添加一个RememberMeFilter,用于判断是否存在记住功能的cookie,并自动登录用户。具体配置如下: ``` [filters] rememberMe = org.apache.shiro.web.filter.authc.RememberMeFilter [urls] /** = anon /login = authc /logout = logout /** = user, rememberMe ``` 其中,user表示需要认证的用户,rememberMe表示需要记住功能的用户。 4. 在Shiro的自定义Realm中,实现doGetAuthenticationInfo()方法,用于自动登录用户。具体实现如下: ``` @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { RememberMeAuthenticationToken rememberMeToken = (RememberMeAuthenticationToken) token; String rememberMeCookieValue = (String) rememberMeToken.getPrincipal(); // 解密记住功能的cookie String username = decryptRememberMeCookie(rememberMeCookieValue); // 查询用户信息 User user = userService.getUserByUsername(username); if (user == null) { throw new UnknownAccountException("用户不存在"); } // 构造AuthenticationInfo对象 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( user.getUsername(), user.getPassword(), getName()); return authenticationInfo; } private String decryptRememberMeCookie(String cookieValue) { // 使用Shiro提供的RememberMeManager进行解密 CookieRememberMeManager rememberMeManager = new CookieRememberMeManager(); byte[] rememberMeKey = Base64.decode(rememberMeManager.getCipherKey()); CipherService cipherService = new DefaultCipherService(); Cipher cipher = cipherService.createCipher(rememberMeKey); byte[] decrypted = cipher.decrypt(Base64.decode(cookieValue)); return new String(decrypted); } ``` 其中,decryptRememberMeCookie()方法使用Shiro提供的RememberMeManager进行记住我信息的解密。在解密完成后,根据用户名查询数据库中的用户信息,并构造AuthenticationInfo对象返回。这样,当用户使用记住功能时,Shiro就能自动登录用户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值