Spring Boot + Spring Security

一、Spring Security 是 Spring Boot 自动识别

1、只要引入了 Spring Security 依赖,Spring Boot 就会自动启用它

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

不需要写一行配置代码,Spring Security 就会生效。

Spring Boot 启动时就会:

✔ 自动创建一整套 Security Filter

✔ 自动保护所有接口

✔ 自动生成 /login 登录页(跳转到Spring Boot的默认 formLogin登录页面,这个路径并不是自己配置的路劲)

✔ 自动要求所有请求必须登录

2、自动配置默认做了什么

行为 默认值
所有接口 必须认证
登录方式 表单登录
登录地址 /login
登出地址 /logout
用户 自动生成一个
密码 启动日志打印

二、前后端分离的项目应该怎么做?

1、为什么前后端分离时 不适合

前后端分离时,正确行为是:

情况 正确返回
未登录 401 JSON
已登录 正常数据

默认 formLogin 会:

情况 实际行为
未登录 302 跳 /login
前端 拿到 HTML
Security 仍认为你没登录

➡️ 永远无法建立登录态 尤其是前端已经写了login的界面 永远也不会跳转到前端的登录界面

2、前后端路线

显式关闭 formLogin,返回 401

你必须写一个 SecurityConfig(这是关键一步):

复制代码
package com.hj.mapserver.config;

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                // 前后端分离必须关闭表单登录和HTTP基本认证
                .formLogin(formLogin -> formLogin.disable())
                .httpBasic(httpBasic -> httpBasic.disable())

                // 未登录直接返回 401,不跳页面
                .exceptionHandling(exceptionHandling ->
                        exceptionHandling.authenticationEntryPoint((req, resp, e) -> {
                            resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                        })
                )

                // 接口权限配置
                .authorizeHttpRequests(authorizeHttpRequests ->
                        authorizeHttpRequests
                                .requestMatchers("/login", "/check/**", "/query/system/user").permitAll()
                                .anyRequest().authenticated()
                )

                // 前后端分离关闭CSRF
                .csrf(csrf -> csrf.disable());

        return http.build();
    }
}
相关推荐
Anastasiozzzz1 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
骇客野人1 小时前
通过脚本推送Docker镜像
java·docker·容器
韩立学长1 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
铁蛋AI编程实战1 小时前
通义千问 3.5 Turbo GGUF 量化版本地部署教程:4G 显存即可运行,数据永不泄露
java·人工智能·python
晚霞的不甘1 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
SunnyDays10111 小时前
使用 Java 冻结 Excel 行和列:完整指南
java·冻结excel行和列
摇滚侠2 小时前
在 SpringBoot 项目中,开发工具使用 IDEA,.idea 目录下的文件需要提交吗
java·spring boot·intellij-idea
云姜.2 小时前
java多态
java·开发语言·c++
李堇2 小时前
android滚动列表VerticalRollingTextView
android·java
泉-java2 小时前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言