259.Spring Boot+Spring Security:记住我(Remember-Me): 基于持久化token的方案

Posted SpringBoot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了259.Spring Boot+Spring Security:记住我(Remember-Me): 基于持久化token的方案相关的知识,希望对你有一定的参考价值。

说明

(1)JDK版本:1.8

(2)Spring Boot 2.0.6

(3)Spring Security 5.0.9

(4)Spring Data JPA 2.0.11.RELEASE

(5)hibernate5.2.17.Final

(6)mysqlDriver 5.1.47

(7)MySQL 8.0.12

 

前言

       在前一节,我们使用了简单加密token的方式实现了“记住我“,这一节我们使用持久化token的方式进行实现”记住我“。

 

一、编码分析

       我们先分析下都需要做什么事情:

1如何开启持久化token方式:可以使用and().rememberMe()进行开启记住我,然后指定tokenRepository(),即指定了token持久化方式。


2tokenRepository怎么实现:这里我们可以使用Spring Security提供的JdbcTokenRepositoryImpl即可,这里只需要配置一个数据源即可。


3持久化token的数据保存在哪里:这里的数据是保存在persistent_logins表中。


4persistent_logins表生成方式:有两种方式可以生成,第一种就是手动方式,根据表结构自己创建表;第二种方式就是使用JdbcTokenRepositoryImpl配置为自动创建,这种方式虽然会自动生成,但是存在的一个小问题就是第二次运行程序的就会保存了,因为persistent_logins已经存在了,不知道底层为什么就不能判断,或者处理下异常呐?所以我的使用方式就是第一次执行的时候,打开配置,生成表之后,注释掉配置。

 

二、编码实现

2.1 定义持久化的tokenRepository

       在WebSecurityConfig中定义tokenRepository()方法,由于在方法的实现中需要使用到数据源,我们需要先注入数据源:

@Autowired
private DataSource dataSource;


       tokenRepository()的实现代码如下:

@Bean
public PersistentTokenRepository tokenRepository(){        
        JdbcTokenRepositoryImpl jdbcTokenRepositoryImpl =new JdbcTokenRepositoryImpl();
        jdbcTokenRepositoryImpl.setDataSource(dataSource);
        //自动创建数据库表:persistent_logins,使用一次后注释掉,不然会报错
        //jdbcTokenRepositoryImpl.setCreateTableOnStartup(true);
        return jdbcTokenRepositoryImpl;
}

       在这上面有一段注释setCreateTableOnStartup,就是在启动的时候,会自动创建表persistent_logins,多次启动会报错,所以在表创建成功之后,会注释掉这段代码哦。

 

2.2 开启remember me功能

配置WebSecurityConfig类中的configure(HttpSecurityhttp)方法,开启remember me功能:

http.authorizeRequests() // 定义哪些URL需要被保护、哪些不需要被保护
            .antMatchers("/login").permitAll()// 设置所有人都可以访问登录页面
            .antMatchers("/","/index").permitAll()
            .antMatchers("/test/**","/test1/**").permitAll()
            .antMatchers("/res/**/*.{js,html}").permitAll()
            .anyRequest().access("@authService.canAccess(request,authentication)")

            //.anyRequest().authenticated()  // 任何请求,登录后可以访问
            .and().formLogin().loginPage("/login")

            //设置记住我
            .and().rememberMe().tokenRepository(tokenRepository()).tokenValiditySeconds(1209600) .userDetailsService(customUserDetailService)

            //设置并发session个数.
            .and().sessionManagement().maximumSessions(1)
            ;


tokenValiditySeconds()配置cookie的过期时间,默认就是1209600秒,即2周。

 

2.3 登录页login.html上添加一个CheckBox控件

       在登录页login.html上添加一个CheckBox控件:

<form th:action="@{/login}" method="post">
     <div><label> 用户名 : <input type="text" name="username"/> </label></div>
     <div><label> 密码: <input type="password" name="password"/> </label></div>
     <div><label> <input type="checkbox" name="remember-me"/> 记住我</label></div>
      <div><input type="submit" value="登录"/></div>
</form>


 

2.4 测试

首先生成表:persistent_logins

(1)手动的方式,就是执行以下表结构:

DROP TABLE IF EXISTS `persistent_logins`;
CREATE TABLE `persistent_logins` (
  `username` varchar(64NOT NULL,
  `series` varchar(64NOT NULL,
  `token` varchar(64NOT NULL,
  `last_used` timestamp NOT NULL,
  PRIMARY KEY (`series`)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


(2)自动的方式,就是打开上面启动主动生成表的注解,启动程序即可生成。

这下就可以进行测试了,访问登录页面:

259.Spring Boot+Spring Security:记住我(Remember-Me): 基于持久化token的方案

       登录成功之后,可以看到浏览器的cookie中多了一个cookie:


       这时候说明我们配置的remember-me已经开始工作了。

       查看表persistent_logins:

 


历史文章
























我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟空学院:http://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/R3QepWG

Spring Cloud视频:http://t.cn/R3QeRZc

SpringBoot Shiro视频:http://t.cn/R3QDMbh

SpringBoot交流平台:http://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/R1pSojf

SpringSecurity5.0视频:http://t.cn/EwlLjHh

Sharding-JDBC分库分表实战:http://t.cn/E4lpD6e

以上是关于259.Spring Boot+Spring Security:记住我(Remember-Me): 基于持久化token的方案的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 之注解

Spring boot??????????????????Spring boot??????MySql,Mybatis???PageHelper??????

Spring Boot 事物回滚

使用 Spring Boot 时如何使用 SpringTemplateEngine

jboss spring boot

spring boot微服务通用部署启动脚本