React 前端框架助力企业快速适应数字化转型的挑战与机遇
812
2023-07-08
spring security实现下次自动登录功能过程解析
这篇文章主要介绍了spring security实现记住我下次自动登录功能,文中通过示例代码介绍的非常详细,对大家的学习或者工DoXhCLhUSU作具有一定的参考学习价值,需要的朋友可以参考下
一、原理分析
第一次登陆时,如果用户勾选了readme选项,登陆成功后springsecurity会生成一个cookie返回给浏览器端,浏览器下次访问时如果携带了这个cookie,springsecurity就会放行这次访问。
二、实现方式
2.1 简单实现方式
(1) 在springsecurity的配置文件中,http节点下增加一个remember-me配置
username-parameter="username" password-parameter="password" authentication-failure-forward-url="/failed.html" default-target-url="/index.html" /> 其中remember-me-parameter="remembermeParamater"指定前台传递的是否rememberme的参数名,前台要传递的参数值是true或false (2)前台登录页面上增加一个checkbox
username-parameter="username" password-parameter="password"
authentication-failure-forward-url="/failed.html"
default-target-url="/index.html"
/>
其中remember-me-parameter="remembermeParamater"指定前台传递的是否rememberme的参数名,前台要传递的参数值是true或false
(2)前台登录页面上增加一个checkbox
用户名:
密 码:
记住我:
checkbox的name属性要和上边配置文件中的remember-me-parameter="remembermeParamater"保持一致。
(3)测试
启动工程,进行登录,登录成功后观察cookie,会发现服务器端返回了一个名为remember-me的cookie
现在关闭浏览器,再次打开并访问,只要不清除cookie就可以直接访问资源,不需要重新登录。
这种方式有http://个弊端,浏览器端要携带的这个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标签的内容改为如下内容
token-validity-seconds="86400"/> data-source-ref="dataSource"用来指定数据源,spring-security通过数据源来操作数据库中的persistent_logins表 token-validity-seconds表示rememberme的有效时间,以秒为单位,这里的86400=24*3600表示一天 (3)测试 启动工程,进行登录,登录成功后会在persistent_logins表中生成一条记录, 关闭浏览器再次访问时会根据浏览器中携带的cookie值来查找数据库中的这条记录,如果查询到了就认证通过 三、区分是密码登录还是rememberme登录 在用户进行一些敏感操作时,需要区分是否是rememberme登录,如果是需要让用户跳转到登录页面。 在congtroller层提供一个方法来进行判断 @GetMapping("/isRemembermeUser") publicDoXhCLhUSU boolean isRemembermeUser(){ Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if(authentication==null){ return false; } //判断当前用户是否是通过rememberme登录,是返回true,否返回false return RememberMeAuthenticationToken.class.isAssignableFrom(authentication.getClass()); } 先使用密码登录,访问http://localhost/user/isRemembermeUser.do,后台接口返回false,再关闭浏览器再次访问这个地址,后台接口返回true,表示这次是使用rememberme进行的认证。 测试工程代码的地址:工程示例
token-validity-seconds="86400"/>
data-source-ref="dataSource"用来指定数据源,spring-security通过数据源来操作数据库中的persistent_logins表
token-validity-seconds表示rememberme的有效时间,以秒为单位,这里的86400=24*3600表示一天
(3)测试
启动工程,进行登录,登录成功后会在persistent_logins表中生成一条记录,
关闭浏览器再次访问时会根据浏览器中携带的cookie值来查找数据库中的这条记录,如果查询到了就认证通过
三、区分是密码登录还是rememberme登录
在用户进行一些敏感操作时,需要区分是否是rememberme登录,如果是需要让用户跳转到登录页面。
在congtroller层提供一个方法来进行判断
@GetMapping("/isRemembermeUser")
publicDoXhCLhUSU boolean isRemembermeUser(){
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if(authentication==null){
return false;
}
//判断当前用户是否是通过rememberme登录,是返回true,否返回false
return RememberMeAuthenticationToken.class.isAssignableFrom(authentication.getClass());
}
先使用密码登录,访问http://localhost/user/isRemembermeUser.do,后台接口返回false,再关闭浏览器再次访问这个地址,后台接口返回true,表示这次是使用rememberme进行的认证。
测试工程代码的地址:工程示例
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~