4 springboot security+记住我功能

在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接口实现。

测试

登陆后
在这里插入图片描述
登陆后数据库中会存有当前用户的持久化数据
在这里插入图片描述
浏览器中也存在
在这里插入图片描述
关闭浏览器再次访问我们的资源不需要重新登录了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值