登录实现记住我功能

原理

#
在这里插入图片描述

实现

登录页面添加记住我checkbox

在这里插入图片描述

        <tr>
            <td colspan='2'><input name="remember-me" type="checkbox" value="true" />记住我</td>
        </tr>

注意 name=“remember-me” 是固定的

BrowserSecurityConfig 中初始化 PersistentTokenRepository

@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {

································
    @Autowired
    private DataSource dataSource;
······························
    @Bean
    public PersistentTokenRepository persistentTokenRepository(){
        JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
        tokenRepository.setDataSource(dataSource);
        //tokenRepository.setCreateTableOnStartup(true);
        //启动时建立这张表persistent_logins,也可以吧创建表语句拿去手动执行
        //只能执行一次,第二次需要关掉,否则报错MySQLSyntaxErrorException: Table 'persistent_logins' already exists
        return tokenRepository;
    }
    ································

其中DataSource为demo application中配置的数据源

在这里插入图片描述

BrowserProperties 加入记住时间属性

public class  BrowserProperties {
    ·····················
	private int rememberMeSecodes = 3600;//秒
	························

BrowserSecurityConfig configure配置

首先引入UserDetailsService

    @Qualifier("myUserDetailsService")
    @Autowired
    private UserDetailsService userDetailsService;//也要引入userDetailsService

config方法

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        //http.formLogin()   //指定身份认证的方式为表单登录
        //http.httpBasic()

        ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter();
        validateCodeFilter.setAuthenticationFailureHandler(whaleAuthenctiationFailureHandler);//设置错误过滤器

        validateCodeFilter.setSecurityProperties(securityProperties);
        validateCodeFilter.afterPropertiesSet();


        http.addFilterBefore(validateCodeFilter,UsernamePasswordAuthenticationFilter.class)
                .formLogin()
//                .loginPage("/signIn.html") //指定登录页面的url
//                .loginPage("/anthentication/require") //指定登录页面的url
                .loginPage(securityProperties.getBrowser().getLoginPage()) //指定登录页面的url
                .loginProcessingUrl("/authentication/form")
                .successHandler(whaleAuthenticationSuccessHandler)
                .failureHandler(whaleAuthenctiationFailureHandler)
                .permitAll()
                .and()

            .rememberMe()
                .tokenRepository(persistentTokenRepository())
                .tokenValiditySeconds(securityProperties.getBrowser().getRememberMeSecodes())
                .userDetailsService(userDetailsService)


                .and()
                .authorizeRequests() //对请求授权
//                .antMatchers("/signIn.html","/code/image").permitAll() //加一个匹配器 对匹配的路径不进行身份认证
                .antMatchers(securityProperties.getBrowser().getLoginPage(),"/code/image").permitAll() //加一个匹配器 对匹配的路径不进行身份认证
                .anyRequest()        //任何请求
                .authenticated()    //安全认证
                .and()
                .cors().disable().csrf().disable();// 禁用跨站攻击
                // 默认都会产生一个hiden标签 里面有安全相关的验证 防止请求伪造 这边我们暂时不需要 可禁用掉
                //任何请求都必须经过表单验证才能进行访问

       /* http.csrf().disable().cors().disable().headers().disable()
                .authorizeRequests()
                .antMatchers("/signIn.html").permitAll() // 配置不需要身份认证的请求地址
                .anyRequest().authenticated() // 其他所有访问路径需要身份认证
                .and()
                .formLogin()
                .loginPage("/signIn.html") // 指定登录请求地址
                .loginProcessingUrl("/authentication/form")
                .permitAll();
        */


    }

上一节的错误 启动报错

在这里插入图片描述
如果demo中的application中注释掉

#whale.security.code.image.url = /user,/user/*

configurls会为null,直接循环会报错,应该先判空,,否则系统启动报错 控制台打印如下错误信息

2019-05-17 08:40:23.998  WARN 5808 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: 
Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is java.lang.NullPointerException

测试

在这里插入图片描述
登录成功后,重新启动服务
在这里插入图片描述
说明登录信息是保存到数据库的

再看下数据库
在这里插入图片描述

AbstractAuthenticationProcessingFilter
在这里插入图片描述

class PersistentTokenBasedRememberMeServices extends AbstractRememberMeServices
在这里插入图片描述
1创建新token放到数据库中
2将token写入浏览器中

RememberMeAuthenticationFilter

在这里插入图片描述
PersistentTokenBasedRememberMeServices
在这里插入图片描述
在这里插入图片描述
最后又回到userdetailservice

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现登录页面的“记住我”功能,你可以使用浏览器的cookie或者本地存储来保存用户的登录状态。以下是一种简单的实现方式: 1. 在登录表单中添加一个复选框,用于选择“记住我”功能。 ```html <input type="checkbox" id="rememberMe" name="rememberMe"> <label for="rememberMe">记住我</label> ``` 2. 在用户提交登录表单时,检查复选框是否被选中。如果选中了,将生成一个持久的标识符(如随机生成的token)作为用户身份验证的凭证,并将其存储在cookie或本地存储中。 ```javascript var rememberMeCheckbox = document.getElementById("rememberMe"); var token = generateToken(); // 生成一个唯一的token if (rememberMeCheckbox.checked) { // 将token存储在cookie中 document.cookie = "token=" + token + "; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/"; } else { // 将token存储在本地存储中 localStorage.setItem("token", token); } ``` 3. 当用户再次访问登录页面时,检查cookie或本地存储中是否存在token。如果存在,则自动填充登录表单,并直接进行身份验证。 ```javascript var token = getCookie("token") || localStorage.getItem("token"); if (token) { // 自动填充登录表单 document.getElementById("username").value = getUsernameFromToken(token); document.getElementById("password").value = getPasswordFromToken(token); // 进行身份验证 authenticateUser(); } ``` 这只是一个简单的示例,实际实现可能涉及更多的安全性考虑和后端逻辑。记住在存储用户敏感信息时要采取适当的安全措施,并遵循最佳实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值