springSecurity-记住我(Remember me)

一.记住我概述

Remember me(记住我)记住我,当用户发起登录勾选了记住我,在一定的时间内再次登录就不用输入用户名和密码了,即使浏览器退出重新打开也是如此。

二.流程分析

在SpringSecurity中提供RememberMeAuthenticationFilter过滤器来实现记住我功能,其核心流程如下:

1.认证成功UsernamePasswordAuthenticationFilter会调用RememberMeServices创建Token

(见其父类AbstractAuthenticationProcessingFilter.successfulAuthentication),同时 RemeberMeService 会调用TokenRepository将Token写入数据库(persistent_logins),然后 RemeberMeService通 过Reponse.addCookie把Token写到浏览器的Cookies中

2.当浏览器再次发起请求会进入RemeberMeAuthenticationFilter,该Filter获取到请求中的token交给RemeberMeService

3.RemeberMeService调用TokenRepository去数据库中根据Token查询用户名

4.调用UserDetilasService.loadUserByUsername根据用户名获取用户认证信息

5.通过authenticationManager.authenticate,做一次认证,然后把用户信息放入上下文对象中

三,实现

1,开启记住我功能(http.rememberMe();)

java 复制代码
protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/public/**").permitAll() // 允许访问公开路径
                .antMatchers("/public/index").access("hasRole('vip')") // 需要指定用户在可以使用
                .antMatchers("/admin/**").access("hasRole('admin')") // 需要指定用户在可以使用
                .anyRequest().authenticated() // 其他请求需要认证
                .and()
                .formLogin() // 使用表单登录
                .loginPage("/login") // 指定登录页面

                .permitAll() // 允许所有用户访问登录页面
                .and()
                .logout() // 配置注销
                .logoutUrl("/logout") // 注销路径
                .logoutSuccessUrl("/login?logout") // 注销成功后跳转的页面
                .and()
                .csrf().disable();//关闭csrf功能
                //记住我
                http.rememberMe();

    }

2,测试,关闭浏览器再次打开用户依旧存在

本质上是保存到cookie,通过浏览器审查元素的application中可以看到

3,如果使用自己的页面中的按钮,可以给按钮设置name,再在配置后面加上如下方法

复制代码
http.rememberMe().rememberMeParameter("remember");

四,定制登录页

在配置中设置,用.loginProcessingUrl("/login")并将前端form表单的action设置为括号内相同即可,但如果前端用户名和密码前后端不一样,则需要进行设置,括号内的属性为前端页面的name属性

java 复制代码
http.formLogin().loginPage("/toLogin").usernameParameter("username").passwordParameter("password").loginProcessingUrl("/login");
相关推荐
C+++Python36 分钟前
详细介绍一下Java泛型的通配符
java·windows·python
JosieBook1 小时前
【数据库】时序预测能力的分级进化:TimechoAI如何让每一类用户都能精准预见未来
java·开发语言·数据库
一生了无挂2 小时前
Java处理JSON技巧教学(从基础到高阶实战全覆盖)
java·开发语言·json
李白的天不白3 小时前
使用 SmartAdmin 进行前后端开发
java·前端
swordbob3 小时前
Spring 单例 Bean 是线程安全的吗?
java·开发语言
2601_951643773 小时前
Python第一,Java跌出前三,C语言杀回来了
java·c语言·python·编程语言排行·技术趋势
腾科IT教育4 小时前
Spring AI Alibaba 向量(VectorStore)
人工智能·spring·microsoft
IT 行者5 小时前
GitHub Spec Kit 实战(五):/speckit.tasks 怎么拆——Spec Kit 五部曲收官
java·ai编程·claude
(Charon)6 小时前
【C++ 面试高频基础:指针、引用、const、static、new/delete 总结】
java·开发语言
Yeats_Liao6 小时前
Feed流系统设计(三):数据模型与存储设计,从表结构到Redis收件箱
java·javascript·redis