当前位置: 首页 > news >正文

Spring Security自动处理/login请求,后端控制层没有 @PostMapping(“/login“) 这样的 Controller 方法

一:前言
(1)Spring Security概念:

Spring Security 是属于 Spring 生态下一个功能强大且高度可定制的认证和授权框架,它不仅限于 Web 应用程序的安全性,也可以用于保护任何类型的应用程序。

(2)场景描述:

当前端请求 /login 接口,后端并没有对登录接口有@PostMapping("/login")的注解,且框架中有使用Spring Security当做权限校验框架。原因是Spring Security有自动处理解析 /login 接口功能

二:思路整理分析
(1)官方文档

在Spring Security默认帮我们处理了登录、登出等接口
文档地址:表单登录 :: Spring Security

(2)主要思路:

①前端请求 POST /login,浏览器将请求重定向到登录页面

②Spring Security 的 UsernamePasswordAuthenticationFilter 拦截,然后提取username 和 password

③调用配置的 UserDetailsService 实例的 loadUserByUsername(username)

④如果返回 UserDetails,继续密码比对(PasswordEncoder)

⑤成功 → 认证成功,生成 SecurityContext,失败 → 抛出异常(如 UsernameNotFoundException)

三:步骤实现
(1)关键配置

代码参考如下:

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.requestMatchers("/login").permitAll().anyRequest().authenticated()).formLogin(Customizer.withDefaults()) // 使用默认表单登录.csrf().disable(); // 为了测试方便关掉 CSRF(生产不建议)return http.build();}@Beanpublic UserDetailsService userDetailsService() {return new CustomUserDetailsService(); // 自定义实现}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}
(2)继承实现UserDetailsService 接口,重写loadUserByUsername(String username)方法

代码如下:(在此方法中可以执行需要的逻辑)

@Service
public class CustomUserDetailsService implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 查询数据库...if (user == null) throw new UsernameNotFoundException("用户不存在");return new User(user.getUsername(), user.getPassword(), getAuthorities());}
}
(3)登录完成之后处理(成功、失败、异常)

以上是我配置的参数

官网文档:身份验证事件 :: Spring Security

根据返回的信息,分别处理不同的事件

四:总结

使用Spring Security 框架,可以不需要写 Controller层的 /login,Spring Security 自动帮我们处理了很多的安全校验,希望能够帮助其他小伙伴看懂这个逻辑

http://www.lryc.cn/news/613705.html

相关文章:

  • 设计模式(二)——策略模式
  • 冠雅新品 | 以“无形之光”守护双眸,以“无声之智”浸润生活
  • 基于R语言,“上百种机器学习模型”学习教程 | Mime包
  • 【昇腾】Atlas 500 A2 智能小站制卡从M.2 SATA盘启动Ubuntu22.04系统,重新上电卡死没进系统问题处理_20250808
  • 主播生活模拟器2|主播人生模拟器2 (Streamer Life Simulator 2)免安装中文版
  • 31-数据仓库与Apache Hive-Insert插入数据
  • Pinterest视觉营销自动化:亚矩阵云手机实例与多分辨率适配技术
  • 远期(Forward)交易系统全球金融市场解决方案报告
  • 32-Hive SQL DML语法之查询数据
  • 《Hive、HBase、StarRocks、MySQL、OceanBase 全面对比:架构、优缺点与使用场景详解》
  • 安装部署K8S集群环境(实测有效版本)
  • K8s 常见故障案例分析
  • ArgoCD 与 GitOps:K8S 原生持续部署的实操指南
  • hive-日期拆分为多行
  • 二、k8s 1.29 之 网络
  • 2025年城市建设与智慧交通国际会议(ICUCIT 2025)
  • Vue复习
  • 暴力解决MySQL连接失败
  • 协同进化:AIGC、Agent和MCP如何相互促进共同发展
  • 内容分发机制研究:实测一款多源短视频聚合App
  • 医防融合中心-智慧化慢病全程管理医疗AI系统开发(上)
  • C++程序库选择:权衡与取舍的艺术——以iostream和stdio为例
  • 低压电工-------元器件认识
  • react+echarts实现个性化评分展示(类进度条)
  • AR眼镜:能源行业设备维护的“安全守护者”
  • Java 虚拟机之双亲委派机制
  • 接口自动化-pytest
  • 使用winsw把SpringBoot项目注册成window服务
  • Linux怎么查看时区信息?(Linux时区)(tzselect)
  • Xvfb虚拟屏幕(Linux)中文入门篇1:(wikipedia摘要,适当改写)