Shiro 实现记住我功能

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

 

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

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

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

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

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

1)subject.isAuthenticated()

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

2)subject.isRemembered()

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

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

扫描二维码关注公众号,回复: 6045429 查看本文章

一、演示 记住我 功能

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 ~

猜你喜欢

转载自blog.csdn.net/qq_42402854/article/details/89598647