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();
    }
}
相关推荐
Python私教2 分钟前
如意Agent日志系统重构:从 print() 大海捞针到结构化可观测性栈
java·前端·重构
jieyucx7 分钟前
Go 零基础数据结构:顺序表(像「排抽屉」一样学增删改查)
java·数据结构·golang
曦夜日长8 分钟前
C++ STL容器string(一):string的变量细节、默认函数的认识以及常用接口的使用
java·开发语言·c++
北山有鸟15 分钟前
IS_ERR 判断出错后,再用 PTR_ERR 把它强制转换回 int 型的错误码作为函数的返回值。
java·开发语言
phltxy21 分钟前
深度解析:Spring Cloud Gateway 从入门到实战
java·开发语言
HAPPY酷25 分钟前
从Public到Private:UE5 C++类创建路径差异全解析
java·c++·ue5
许彰午32 分钟前
CacheSQL(一):手写数据库的工程化重生
java·数据库·缓存
shjita36 分钟前
记录java执行中的一个错误细节
java·开发语言
空中海37 分钟前
Docker入门到精通
java·docker·eureka
Java成神之路-41 分钟前
多 Filter、多 Interceptor 执行优先级控制方案
spring·java web