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");
相关推荐
sun03222 小时前
【架构基础】Spring中的PropertySourcesPlaceholderConfigurer介绍 (并非新知识,比较古老的一种使用方式)
java·spring·架构
chilavert3182 小时前
技术演进中的开发沉思-356:重排序(中)
java·开发语言
毕设源码-邱学长2 小时前
【开题答辩全过程】以 基于SSM的儿童福利院管理系统为例,包含答辩的问题和答案
java·eclipse
TT哇3 小时前
【实习】数字营销系统 银行经理端(interact_bank)前端 Vue 移动端页面的 UI 重构与优化
java·前端·vue.js·ui
Elieal3 小时前
SpringBoot 数据层开发与企业信息管理系统实战
java·spring boot·后端
识君啊3 小时前
MyBatis-Plus 逻辑删除导致唯一索引冲突的解决方案
java·spring boot·mybatis·mybatis-plus·唯一索引·逻辑删除
Coder_Boy_3 小时前
Java开发者破局指南:跳出内卷,借AI赋能,搭建系统化知识体系
java·开发语言·人工智能·spring boot·后端·spring
QT.qtqtqtqtqt3 小时前
SQL注入漏洞
java·服务器·sql·安全
NE_STOP3 小时前
spring6-代理模式和AOP
spring
独自破碎E3 小时前
BISHI23 小红书推荐系统
java·后端·struts