当用户勾选了自动登录,在有效时间内,即使用户关闭了浏览器,下次打开也会处于登录状态(前提是没有清空浏览器cookie)
使用Spring Security实现步骤:
1.在登录页面提供一个选框供用户选择,name的值必须为:remember-me,否则得在remember me过滤器中指定和它对应的名称,value的值必须为:true | on | yes | 1
<div class="checkbox icheck">
<label><input type="checkbox" name="remember-me" value="true"> 记住 下次自动登录</label>
</div>
2.开启remember me过滤器
<security:http auto-config="true" use-expressions="true"> <!--省略其余配置--> <!--开启remember me过滤器,设置token存储时间,单位为秒--> <security:remember-me token-validity-seconds="60"/> </security:http>
3.启动测试
在浏览器可看到cookie已经被保存下来了,有效期为设定的时间,在设定的时间内即使关闭了浏览器,重新打开,依然处于登录状态
remember me 安全性分析:
记住我功能能够提升用户的体验,但是安全性却令人担忧。因为 Cookie毕竟是保存在客户端的,很容易盗取,而且cookie的值还与用户名、密码这些敏感数据相关,虽然加密了,但是将敏感信息存在客户端,还是不太安全。在使用此功能的时候,要注意用完网站要及时手动退出登录,清空认证信息。
此外,SpringSecurity还提供了remember me的另一种相对更安全的实现机制 :在客户端的cookie中,仅保存一个无意义的加密串(与用户名、密码等敏感数据无关),然后在db中保存该加密串-用户信息的对应关系,自动登录时,用cookie中的加密串,到db中验证,如果通过,自动登录才算通过。
实现步骤:
1.创建一张表,注意这张表的名称和字段都是固定的,不能修改。
CREATE TABLE `persistent_logins` ( `username` VARCHAR(64) NOT NULL, `series` VARCHAR(64) NOT NULL, `token` VARCHAR(64) NOT NULL, `last_used` TIMESTAMP NOT NULL, PRIMARY KEY (`series`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;
2.然后将spring-security.xml中改为:
<security:http auto-config="true" use-expressions="true"> <!-- 开启remember me过滤器, data-source-ref="dataSource" 指定数据库连接池 token-validity-seconds="60" 设置token存储时间 remember-me-parameter="remember-me" 指定记住的参数名 可省略 --> <security:remember-me token-validity-seconds="60" data-source-ref="dataSource" remember-me-parameter="remember-me"/> </security:http>
3.最后测试发现数据库中自动多了一条记录:
选中了记住我功能,表中的数据每登录一次,记录就增多一条,只有主动退出登录,表中的数据才会根据用户名全部清空
显示当前认证用户名
在jsp页面显示:
在顶部引入标签
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
在需要显示的位置使用
<security:authentication property="principal.username" /> 或者
<security:authentication property="name" />
在后台页面显示:
@RequestMapping("/findAll") public String findAll(Model model){ List<SysUser> list = userService.findAll(); model.addAttribute("list", list); // 从后台获取到当前认证通过后的用户名 String name = SecurityContextHolder.getContext().getAuthentication().getName(); System.out.println(name); return "user-list"; }