零基础也能学会的 Spring Security 快速入门

码上见山
2026-04-13 18:36
阅读 1699

大家好,我是工作五年多的后端工程师。记得我当初第一次接触 Spring Security 时,光是看官方文档就头晕眼花——一堆过滤器、认证管理器、用户详情服务……简直像在读天书。但其实,Spring Security 的核心思想非常简单:保护你的网站,不让陌生人随便访问。

今天这篇教程,就是想用最直白的方式,带你从零开始搭建一个带登录认证的 Web 应用。不需要你懂 OAuth2、JWT 或微服务,只要会写基本的 Java 代码就行。而且我会结合实际面试题、开发工具(比如 Moltbot 和 ChatGPT),帮你避开我当年踩过的坑。


一、Spring Security 是什么?为什么需要它?

简单说:Spring Security 是 Spring 家族里专门负责“安全防护”的组件。它能帮你实现:

  • 用户登录/登出
  • 密码加密存储
  • 权限控制(比如管理员才能删文章)
  • 防止 CSRF、XSS 等常见攻击

没有它,你的网站就像没锁门的房子——谁都能进。而有了它,至少得先“敲门验证身份”。

💡 面试题挑战
“Spring Security 的核心原理是什么?”
面试官其实在问:它是如何拦截请求并做权限判断的?
答案关键词:过滤器链(Filter Chain)。我们后面会看到。


二、环境准备:5 分钟搭好开发环境

所需工具清单

工具 版本建议 说明
JDK 17 或 21 推荐 LTS 版本
Maven 3.8+ 项目依赖管理
IDE IntelliJ IDEA / VS Code 写代码用
浏览器 Chrome / Edge 测试登录页面

创建项目(使用 Spring Initializr)

打开 https://start.spring.io,按如下配置:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.2.x(最新稳定版)
  • Dependencies:
    • Spring Web
    • Spring Security
    • Thymeleaf(用于简单页面展示)

点击“Generate”,下载 ZIP 包并解压导入 IDE。

✅ 小技巧:如果你装了 Moltbot(一款智能开发助手插件),可以直接在 IDE 里输入“创建带 Security 的 Spring Boot 项目”,它会自动生成骨架代码!


三、核心概念:三个关键词搞懂 Security

别被术语吓到,记住这三点就够了:

1. Authentication(认证) → “你是谁?”

系统通过用户名+密码确认你的身份。

2. Authorization(授权) → “你能干什么?”

比如普通用户只能看文章,管理员才能删文章。

3. Security Filter Chain(安全过滤器链) → “每条请求都要过安检”

所有 HTTP 请求进来前,都会经过一系列“安检门”(过滤器),决定放行还是拦截。

🧠 类比:就像进机场——先刷身份证(认证),再查行李(授权),整个过程由多个安检点组成(过滤器链)。


四、实战:手把手搭建一个登录系统

我们现在要实现:

  • 访问 /admin 页面需要登录
  • 默认提供一个测试账号:user / password
  • 登录成功后跳转首页

步骤 1:什么都不改,直接启动!

运行 Application.java,然后访问 http://localhost:8080

你会发现:

  • 页面自动跳转到 /login
  • Spring Security 自动生成了一个登录页!
  • 控制台打印了一行临时密码,比如:
    Using generated security password: a1b2c3d4-e5f6-...

这就是 Spring Boot 的“约定优于配置”——你没写任何代码,它已经帮你做了基础防护!

⚠️ 注意:这个临时密码每次启动都会变,只适合本地测试。

步骤 2:配置固定用户名和密码

application.properties 中添加:

spring.security.user.name=admin
spring.security.user.password=123456

重启后,用 admin / 123456 登录即可。

步骤 3:自定义受保护的路径

新建一个配置类:

// src/main/java/com/example/demo/config/SecurityConfig.java
package com.example.demo.config;

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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/public/**").permitAll()   // 公开路径
                .anyRequest().authenticated()                // 其他都需要登录
            )
            .formLogin(form -> form
                .loginPage("/login")                         // 自定义登录页(可选)
                .permitAll()
            )
            .logout(logout -> logout.permitAll());
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

🔍 解读:

  • authorizeHttpRequests:定义哪些路径需要认证
  • formLogin:启用表单登录
  • UserDetailsService:内存中存一个测试用户(生产环境要用数据库!)

步骤 4:创建简单页面测试

新建 src/main/resources/templates/home.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>首页</title></head>
<body>
  <h1>欢迎来到首页!</h1>
  <p>当前用户:<span th:text="${#authentication.principal.username}"></span></p>
  <a href="/admin">进入管理后台</a> |
  <a href="/logout">退出登录</a>
</body>
</html>

再建一个 admin.html

<!DOCTYPE html>
<html>
<body>
  <h2>管理员专区</h2>
  <p>只有登录用户才能看到这里!</p>
  <a href="/">返回首页</a>
</body>
</html>

最后加两个控制器:

@Controller
public class HomeController {
    @GetMapping("/")
    public String home() {
        return "home";
    }

    @GetMapping("/admin")
    public String admin() {
        return "admin";
    }

    @GetMapping("/login")
    public String login() {
        return "login"; // 如果你自定义了登录页
    }
}

💡 如果不想写前端,也可以删掉 Thymeleaf 依赖,直接用 REST API 返回 JSON。但对新手来说,看到页面更有成就感!


五、新手常见问题解答

❓ 问题1:为什么我访问根路径 / 被重定向到 /login

✅ 因为 Spring Security 默认所有路径都需要认证。你可以在 authorizeHttpRequests 中加 .requestMatchers("/", "/public/**").permitAll() 放行首页。

❓ 问题2:密码明文存储会不会不安全?

✅ 绝对不行!上面例子用 withDefaultPasswordEncoder() 只是为了演示。生产环境必须用 BCryptPasswordEncoder

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

然后存密码前先加密:encoder.encode("原始密码")

❓ 问题3:怎么用数据库查用户?

✅ 把 InMemoryUserDetailsManager 换成你自己的 UserDetailsService 实现,从数据库查用户信息即可。这是下一步要学的内容!

❓ 问题4:ChatGPT 能帮我写 Security 配置吗?

✅ 可以,但要小心!我试过让 ChatGPT 生成配置,结果它用了已废弃的 .antMatchers()(Spring Boot 3 已移除)。建议用它辅助理解逻辑,别直接复制代码

🛠️ 提示:你可以问 ChatGPT:“用 Spring Boot 3 写一个基于内存用户的 Security 配置”,然后对比本文代码检查是否正确。


六、学习建议与下一步路线

你现在已经掌握了 Spring Security 的“最小可用知识”。接下来可以:

  1. 连接真实数据库
    实现 UserDetailsService,从 MySQL/PostgreSQL 读取用户。

  2. 集成 JWT(无状态认证)
    适合前后端分离项目,用 Token 替代 Session。

  3. 学习方法级权限控制
    比如用 @PreAuthorize("hasRole('ADMIN')") 注解保护方法。

  4. 应对真实面试题

    • “Security 的过滤器顺序能调整吗?” → 能,通过 addFilterBefore/After
    • “CSRF 是什么?怎么防?” → 默认开启,前端需携带 _csrf token

🎯 避坑指南
别一上来就啃 OAuth2 或 SSO!先把基础认证、权限模型搞清楚,再学高级功能。我见过太多新人被“单点登录”劝退,其实 80% 的项目只需要基础登录。


结语

Spring Security 听起来高大上,但拆开看就是“拦请求 + 验身份 + 查权限”三件事。只要你动手跑一遍上面的代码,就会发现它没那么可怕。

下次遇到“如何保护我的 API?”这种问题,你就能自信地说:“加个 Spring Security,十分钟搞定。”

如果你觉得这篇教程有帮助,不妨试试用 MoltbotChatGPT 复现一遍,并提问:“这段 Security 配置哪里可以优化性能?” —— 你会学到更多!

加油,未来的架构师!

评论 0

最热最新
暂无评论
码上见山Lv.1
0
影响力
0
文章
0
粉丝