在springsecurity增加记住我功能,实现当用户勾选了记住我并登陆成功后能够不用登陆直接可以再次登陆。
token 持久化
需要依赖数据库信息
pom中增加数据库依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
增加数据库配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.78.130:3306/scmdb?useUnicode=yes&characterEncoding=UTF-8&&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
增加持久化对象
@Autowired
private DataSource dataSource;
@Autowired
private UserDetailsService userDetailsService;
/**
* 设置持久化数据
* @return
*/
public PersistentTokenRepository persistentTokenRepository(){
JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
jdbcTokenRepository.setDataSource(dataSource);
jdbcTokenRepository.setCreateTableOnStartup(false);
return jdbcTokenRepository;
}
PersistentTokenRepository为一个接口类,这里我们用的是数据库持久化,
使用PersistentTokenRepository的实现类JdbcTokenRepositoryImpl。
JdbcTokenRepositoryImpl需要指定数据源,所以我们将配置好的数据源对象DataSource注入进来并配置到JdbcTokenRepositoryImpl的dataSource属性中。
createTableOnStartup属性用于是否启动项目时创建保存token信息的数据表,这里设置为false,我们自己手动创建。
查看持久化JdbcTokenRepositoryImpl的源码,能找到持久化到数据库的建表语句。
修改登陆页
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form class="login-page" action="/login" method="post">
<div class="form">
<h3>账户登录</h3>
<input type="text" placeholder="用户名" name="username" required="required" />
<input type="password" placeholder="密码" name="password" required="required" />
<span style="display: inline">
<input type="text" name="imageCode" placeholder="验证码" style="width: 50%;">
<img src="/code/image">
</span>
<input type="checkbox" name="remember-me"/>记住我
<button type="submit">登录</button>
</div>
</form>
</body>
</html>
增加配置记住我功能
protected void configure(HttpSecurity http) throws Exception{
ValidateCodeFilter validateCodeFilter=new ValidateCodeFilter();
validateCodeFilter.setAuthenticationFailureHandler(this.customAuthFailHandler);
http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)
// http
.formLogin()//表单认证
.loginPage("/auth/require")
.loginProcessingUrl("/login")
.successHandler(customAuthSuccessHandler)
.failureHandler(customAuthFailHandler)
.and()
.rememberMe()
.tokenRepository(persistentTokenRepository())
.tokenValiditySeconds(3600)//token有效时间
.userDetailsService(userDetailsService())//处理自动登录逻辑
.and()
.authorizeRequests()//授权配置
.antMatchers("/login.html",
"/auth/require",
"/code/image").permitAll()
.anyRequest()//所有请求
.authenticated()//都需要认证
.and()
.csrf().disable();
}
rememberMe()用于开启记住我功能;tokenRepository(persistentTokenRepository())用于指定token持久化方法;tokenValiditySeconds配置了token的有效时长,单为为秒;userDetailsService(userDetailService)用于处理通过token对象自动登录,这里为我们自定义的UserDetailsService接口实现。
测试
登陆后
登陆后数据库中会存有当前用户的持久化数据
浏览器中也存在
关闭浏览器再次访问我们的资源不需要重新登录了。