Spring Security基础:快速搭建安全认证系统(新手友好版)
开篇:什么是Spring Security?

在写代码的时候,如果你做过一些网站或者服务端项目,肯定遇到过这样的问题:“怎么让只有登录的人才能访问某些功能?”
这时候就需要一个安全框架来帮忙了。Spring Security 就是这样一个用来保护你的应用的安全工具箱。
它可以帮助我们:
- 让用户登录
- 控制哪些页面谁可以看、谁不能看
- 管理用户的权限
- 防止恶意用户做一些不该做的事
简单说:Spring Security 是你 Java 应用的“门卫”,它可以决定哪些人能进来,哪些人不行,进来了之后能干什么。
第一步:环境准备

1. 准备你的开发环境
要使用 Spring Security,需要先准备好以下工具:
✅ 已安装:
- JDK 17 或以上
- IDE(推荐 IntelliJ IDEA / Eclipse / VS Code + Java 插件)
- Maven(构建项目用的工具)
如果没有这些,建议去下面这些地方下载安装:
| 软件 | 下载地址 |
|---|---|
| JDK 17+ | https://adoptium.net/ |
| IntelliJ IDEA | https://www.jetbrains.com/idea/ |
| Maven | https://maven.apache.org/download.cgi |
安装好后,在终端输入:
java -version
mvn -v
如果都能看到版本信息就说明装好了!
第二步:创建 Spring Boot 项目

最简单的做法是使用官网提供的 Spring Initializr 来生成一个项目。
步骤如下:
- 打开 https://start.spring.io/
- 选择或填写:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新稳定版(比如 3.x)
- Group: com.example
- Artifact: springsecuritydemo
- Name: springsecuritydemo
- 点击 "Add Dependencies",加入两个依赖:
- Spring Web
- Spring Security
- 点击下方 "Generate" 按钮下载压缩包,解压到本地
打开 IDE,导入该项目即可。
第三步:了解几个关键概念
在开始动手之前,先理解几个核心术语:
1. 用户认证(Authentication)
👉 它就是判断一个人是不是他所说的那个人的过程。
例子:
- 你输入用户名和密码 → 系统验证是否正确 → 成功登录 → “你是张三”
2. 授权(Authorization)
👉 在确定你是谁之后,再看看你能干啥。
例子:
- 如果你是管理员,你可以删除数据;
- 如果你是普通用户,只能查看; 这一步就是授权。
3. 过滤器链(Filter Chain)
👉 Spring Security 使用一系列过滤器来拦截每一个请求,决定是否允许继续执行。
想象一下:
- 所有请求都要经过一连串的检查关卡(例如登录状态、权限、跨站攻击等等)。
- Spring Security 把每个关卡封装成一个 Filter,形成一条“关卡链”。
4. 登录表单 vs 无界面登录(如 API)
👉 有时候你需要提供登录页,有时候只需要处理 API 请求(比如手机 App 调接口),Spring Security 都支持。
5. 内存用户 vs 数据库用户
我们一开始会用内存存储用户信息(测试方便),后面可以切换为数据库方式(真实环境常用)。
第四步:实战项目 —— 构建一个简易登录认证系统
我们将搭建一个只有两个页面的小项目:
/hello:任何人都可以看到/admin:必须登录且角色是 admin 才能看到
Step 1:添加一个控制器类
路径:src/main/java/com/example/springsecuritydemo/controller/HomeController.java
内容如下:
package com.example.springsecuritydemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/hello")
public String hello() {
return "你好,游客也能看到哦!";
}
@GetMapping("/admin")
public String admin() {
return "欢迎管理员!";
}
}
现在运行项目(点击 main() 方法运行),访问:
http://localhost:8080/hello→ 可以直接看http://localhost:8080/admin→ 浏览器跳转到了登录页(因为未配置安全策略时默认开启了基本登录)
Step 2:添加 Spring Security 配置类
新建文件:SecurityConfig.java
路径:src/main/java/com/example/springsecuritydemo/config/SecurityConfig.java
内容如下:
package com.example.springsecuritydemo.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.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
public class SecurityConfig {
// 配置用户名和密码,并设置角色
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("123456")
.roles("USER")
.build();

UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("123456")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
// 配置访问控制逻辑
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/hello").permitAll() // 所有人都可以访问
.requestMatchers("/admin").hasRole("ADMIN") // 只有 ADMIN 角色才能访问
.anyRequest().authenticated()) // 剩下的所有请求都需要登录
.formLogin(login -> login.permitAll()) // 启用默认登录表单
.logout(logout -> logout.permitAll()); // 允许注销
return http.build();
}
}
⚠️ 注意:
- 我们用了
.withDefaultPasswordEncoder()简化加密过程(生产环境不要这样) - 创建了两个用户:普通用户 user 和管理员 admin
/hello不需要登录,所有人都能访问/admin必须是拥有 ADMIN 角色的用户才能访问
Step 3:运行测试
启动项目后尝试以下操作:
✅ 测试点 1:访问 /hello
→ 不需要登录就能看到内容。
✅ 测试点 2:访问 /admin
→ 弹出登录页面,用户名填 admin,密码 123456
→ 成功后显示 “欢迎管理员!”
✅ 测试点 3:用用户名 user 登录
→ 登录成功但无法访问 /admin 页面(返回 403)
常见问题解答(FAQ)
💬 问:为什么我输入了正确的账号密码,却一直提示登录失败?
答:请确认你输入的是正确的用户名和密码(我们设定的是 admin/123456)。另外,密码没有使用加密函数(因为我们用了 .withDefaultPasswordEncoder(),所以必须明文输入 123456)
💬 问:我没有看到登录页面,而是出现了 Basic Auth 的弹窗?
答:可能你在配置中没有启用 formLogin,请检查你的 SecurityConfig.java 文件,确保包含下面这一句:
.formLogin(login -> login.permitAll())
💬 问:能不能不弹出登录页,直接返回 JSON 错误信息?
答:可以!后续我们会学到如何适配前后端分离项目的 RESTful 风格登录方案,比如配合 JWT 返回 token。
💬 问:我在配置里写了 permitAll,为什么还是要求登录?
答:可能是匹配路径有问题。比如:
.requestMatchers("/hello/**").permitAll()
实际访问 /hello/abc 可以通过;但如果写成了:
.requestMatchers("/hello").permitAll()
则 /hello/xxx 可能还是会要求登录。建议初学者使用更通用的通配符,例如 /hello/**。
💬 问:我设置了多个角色,但好像只认第一个?
答:确保角色名称不要拼错,且使用 .roles(...) 而不是 .authorities(...)。两者区别是:roles 会自动加上前缀 ROLE_,而 authorities 则不会。
学习建议:下一步怎么学?
恭喜你已经完成了一个最基本的 Spring Security 登录认证系统!
接下来你可以沿着这几个方向继续深入学习:
🚀 方向 1:数据库认证
- 当前只是模拟用户存在内存中,真正的应用通常从数据库加载用户
- 学习如何集成 MySQL + JPA + Spring Data + 动态查询用户信息
🔐 方向 2:密码加密实战
- 目前我们用了明文密码
.withDefaultPasswordEncoder(),这是不安全的 - 推荐使用
BCryptPasswordEncoder并结合数据库做持久化管理
💻 方向 3:整合 JWT 实现无状态登录
- 对于前后端分离项目(Vue、React、小程序等),更适合使用 JWT Token 登录
- 学习如何生成 token、解析 token、校验 token
🌐 方向 4:实现 OAuth2 登录
- 让用户用微信、QQ、GitHub 登录你的系统
- 适合社交平台接入与 SSO 单点登录场景
总结
在这篇文章中,我们完成了以下几个目标:
✅ 理解了 Spring Security 的作用
✅ 搭建了开发环境并创建了一个简单项目
✅ 实现了基于内存的登录和权限控制
✅ 解决了一些常见问题
✅ 给出了下一步的学习路线
别忘了实践是掌握 Spring Security 的关键,多敲一遍配置代码,比看十遍教程都更有帮助!
如果你喜欢这种通俗易懂的教学风格,记得关注我,我会持续带来更多实用又接地气的编程教程 😊
📌 文章总字数:约 2959 字
🎯 面向人群:零基础 Java 新手
💡 教学理念:少讲理论,多上代码,轻松入门

评论 0