这篇文章主要介绍了spring security实现记住我下次自动登录功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
一、原理分析
第一次登陆时,如果用户勾选了readme选项,登陆成功后springsecurity会生成一个cookie返回给浏览器端,浏览器下次访问时如果携带了这个cookie,springsecurity就会放行这次访问。
二、实现方式
2.1 简单实现方式
(1) 在springsecurity的配置文件中,http节点下增加一个remember-me配置
<security:http auto-config="true" use-expressions="false"> <!-- 配置链接地址,表示任意路径都需要ROLE_USER权限,这里可以配置 一个逗号隔开的角色列表--> <security:intercept-url pattern="/**" access="ROLE_USER"/> <!--自定义登录页面--> <security:form-login login-page="/login.html" login-processing-url="/login" username-parameter="username" password-parameter="password" authentication-failure-forward-url="/failed.html" default-target-url="/index.html" /> <!--关闭csrf,默认是开启的--> <security:csrf disabled="true"/> <security:remember-me remember-me-parameter="remembermeParamater" /> <!-- 退出 --> <security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.html"/> </security:http>
其中remember-me-parameter="remembermeParamater"指定前台传递的是否rememberme的参数名,前台要传递的参数值是true或false
(2)前台登录页面上增加一个checkbox
<form action="/login" method="post"> 用户名:<input type="text" name="username" placeholder="请输入用户名"><br> 密 码:<input type="password" name="password" placeholder="请输入密码"><br> 记住我:<input type="checkbox" name="remembermeParamater" value="true"> <input type="submit" value="登录"> </form>
checkbox的name属性要和上边配置文件中的remember-me-parameter="remembermeParamater"保持一致。
(3)测试
启动工程,进行登录,登录成功后观察cookie,会发现服务器端返回了一个名为remember-me的cookie
现在关闭浏览器,再次打开并访问,只要不清除cookie就可以直接访问资源,不需要重新登录。
这种方式有个弊端,浏览器端要携带的这个cookie值服务端是存放在内存中的,并没有进行持久化,所以如果服务重启后服务器端存储的这个值就会丢失,浏览器端的rememberme就会失效。为了解决这个问题就需要将服务器端生成的这个cookie值持久化到数据库中。
2.2 数据库实现方式
(1)创建一张表用来持久化rememberme的记录
-- 创建记录rememberme记录的表
CREATE TABLE persistent_logins ( username VARCHAR(64), series VARCHAR(64), token VARCHAR(64), last_used DATE );
(2)将spring-security 配置文件中的rememberme标签的内容改为如下内容
<security:remember-me remember-me-parameter="remembermeParamater" data-source-ref="dataSource" token-validity-seconds="86400"/>