时间:2022-12-26 10:53:43 | 栏目:JAVA代码 | 点击:次
在一般的网站中,比如Bilibili
。当用户登录成功后,关闭浏览器后,下次重新进入网站,可以自动登录。
本次就来探究如何实现这种自动登录
、记住我
的功能。
需要实现记住我
的功能操作,需要保证具体的实现方式,接下来就来梳理下。
首先,在Security
框架中,针对记住我
的功能实现,Security
框架本身对其做了一定的封装,其实现原理为:
加密后的数据串
和用户基本信息
数据。当认证器中,根据客户端传递的cookie值,查询服务器,符合用户基本信息,则自动放行。
本质上是不要创建的,Security
框架针对记住我
功能的实现,会在数据库不存在表时,org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl
自动创建一个persistent_logins
表。
如果想手动创建,可以执行下列sql进行表的创建:
CREATE TABLE persistent_logins ( username VARCHAR ( 64 ) NOT NULL, series VARCHAR ( 64 ) PRIMARY KEY, token VARCHAR ( 64 ) NOT NULL, last_used TIMESTAMP NOT NULL );
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl; import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; import javax.sql.DataSource; /** * 注入数据源(记住我) */ @Autowired private DataSource dataSource; /** * 配置操作数据库对象 * @return @Bean public PersistentTokenRepository persistentTokenRepository(){ JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl(); jdbcTokenRepository.setDataSource(dataSource); jdbcTokenRepository.setCreateTableOnStartup(true); // 如果没有配置记住我的数据表,则自动生成 return jdbcTokenRepository; }
.and() .rememberMe().tokenRepository(persistentTokenRepository()) // 配置记住我的功能,同时增加查询数据库 cookie 值 .tokenValiditySeconds(60) // 设置cookie的有效时间(秒为单位) .userDetailsService(mySecurityService) // 查询数据库
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/user/login" method="post"> 用户名:<input type="text" name="username" /><br/> 密码:<input type="text" name="password" /><br/> <input type="checkbox" name="remember-me" title="记住我" />自动登录<br/> <input type="submit" value="login" /><br/> </form> </body> </html>
主要代码为:
<input type="checkbox" name="remember-me" title="记住我" />自动登录<br/>
【注意:】name="remember-me" 这是固定写法,否则无法识别!
重启服务器,请求需要被认证的url:
http://localhost/login.html
关闭浏览器,重新打开,重新请求:
http://localhost/loginSuccess.html
由于数据库
本身未创建
persistent_logins
表,只是在配置类中申明创建表
:
此时数据库中,可以看到已存在表信息:
此处需要注意的是,如果配置了自动创建表,如果已存在指定的表,启动会报错!
1、浏览器请求服务器时,会先经过UsernamePasswordAuthenticationFilter
进行认证操作
2、如果UsernamePasswordAuthenticationFilter
认证成功,会调用其父类 AbstractAuthenticationProcessingFilter
中的doFilter
方法。
3、最终执行this.successfulAuthentication(request, response, chain, authResult)
。
即org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices
中的loginSuccess
方法。
然后在org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#onLoginSuccess
中做以下操作:
4、将生成的新的token信息,存储于数据表中,并且也存储在浏览器 cookie 中
。
5、当浏览器关闭,下次登录时,会根据之前设定的remember-me
信息,在org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter
中对其验证!
springboot-security-09-rememberMe