场景应用:SpringSecurity记住我功能实现

记住我功能实现

Spring Security 中 Remember Me 为“记住我”功能,用户只需要在登录时添加 remember-me 复选框,取值为 true。

Spring Security 会自动把用户信息存储到数据源中,以后就可以不登录进行访问。

引入依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

修改核心属性文件添加数据源信息(4项)

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456

编写配置类

SpringSecurity的令牌持久化接口PersistentTokenRepository的一个实现类JdbcTokenRepositoryImpl。

他的作用就是将原本存于内存的session存入数据库。

@Configuration
public class RememberMeConfig {
    
    
    @Autowired
    private DataSource dataSource;

    @Bean
    public PersistentTokenRepository persistentTokenRepository() {
    
    
        //创建JdbcTokenRepositoryImpl对象
        JdbcTokenRepositoryImpl repository = new JdbcTokenRepositoryImpl();
        //设置数据源
        repository.setDataSource(dataSource);
        //自动建表存储 rememberme 信息,第一次启动执行下面代码,是为了在数据库中创建数据表,
        // 第二次就要注释掉,因为表存在,再执行创建表就会报错
        repository.setCreateTableOnStartup(true);
        return repository;
    }
}

修改 SecurityConfig 配置类

http.rememberMe()
.userDetailsService(userDetailsService) //登录逻辑交给哪个对象
.tokenRepository(repository); //持久层对象

在客户端页面中添加复选框

在客户端登录页面中添加 remember-me 的复选框,只要用户勾选了复选框下次就不需要进行登录了。注意:属性名默认必须为"remember-me"。

<form action = "/login" method="post"> 
用户名:<input type="text" name="username"/><br/> 
密码:<input type="text" name="password"/><br/>
<input type="checkbox" name="remember-me" value="true"/> <br/>
<input type="submit" value="登录"/>
</form>

设置 rememberme 有效时间

有效时间默认为 2 周。

//remember Me 
http.rememberMe()
.tokenValiditySeconds(120)//单位:秒
.tokenRepository(repository)
.userDetailsService(userDetailsServiceImpl);

退出登录

用户只需要向 Spring Security 项目中发送/logout 退出请求即可。实现退出非
常简单,只要在页面中添加/logout 的超链接即可。

<a href="/logout">退出登录</a>

退出成功后指定配置路径,可以通过下面的方法进行修改。

http.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login.html");

猜你喜欢

转载自blog.csdn.net/weixin_45525272/article/details/126919470