Spring Security基础:快速搭建安全认证系统
开篇:什么是Spring Security?

在开发Web应用时,安全性是一个非常关键的环节。用户登录、权限控制、数据保护等问题必须得到妥善处理。
Spring Security 是 Spring 框架中用来实现安全控制的核心组件。它可以帮助我们:
- 实现用户登录(认证)
- 控制不同用户的访问权限(授权)
- 保护 API 接口
- 防止常见的安全攻击(如 CSRF)
对于初学者来说,不必一开始就理解所有的细节,只需要掌握如何利用 Spring Security 快速搭建一个安全验证系统即可。本教程将手把手带你入门。
环境准备:你需要哪些工具?

为了顺利完成本教程,你需要准备好以下环境:
软件要求:
| 工具 | 版本建议 | 下载地址 |
|---|---|---|
| Java JDK | 17+ | Oracle JDK 或 OpenJDK |
| IDE | IntelliJ IDEA Community / Eclipse | IDEA下载页 |
| Spring Boot | 最新版(2.7.x 或 3.x) | 使用 Spring Initializr 自动生成项目 |
| Maven | 自带于IDE | 不需单独安装 |
| 浏览器 | Chrome / Firefox等 |
⚠️ 提示:如果你不熟悉 Maven 或 Spring Boot,也不用担心,这些工具都是自动配置好的。
创建项目步骤(使用 Spring Initializr)
- 打开浏览器,访问:https://start.spring.io
- 设置如下选项:
- Project: Maven
- Language: Java
- Spring Boot Version: 推荐选择 3.x
- Group:
com.example - Artifact:
security-demo - Dependencies:
- Spring Web
- Spring Security
- 点击 Generate,下载项目压缩包
- 解压后用 IntelliJ IDEA 打开该项目
✅ 这样我们就有了一个初始的 Spring Boot + Security 项目。
核心概念:几个你必须知道的安全术语

在深入代码之前,先了解几个核心名词,它们是理解 Spring Security 的关键。
1. 认证(Authentication)
就像“你是谁?”——认证就是识别当前用户的流程。
例如:你在网站上输入用户名和密码,后台判断是否正确,这就是认证。
2. 授权(Authorization)
“你能干什么?”——授权决定用户能访问哪些资源或功能。
比如:管理员可以编辑文章,普通用户只能查看。
3. 用户信息存储
Spring Security 支持多种用户来源:
- 内存中的用户(适合学习)
- 数据库中的用户(适合生产)
- 第三方认证(如 OAuth 登录)
我们将先从最简单的内存用户开始。
4. 安全配置类(SecurityConfig)
这是 Spring Security 的主配置文件,你可以在这里定义:
- 哪些路径需要登录才能访问?
- 使用哪种方式做认证?
- 如何定义用户及其角色?
这个类通常是继承 WebSecurityConfigurerAdapter(旧版),但在 Spring Boot 3 中应直接使用 SecurityFilterChain。
实战项目:一步步构建你的第一个安全系统
第一步:创建用户账号(内存用户)
我们在配置类中添加两个用户:
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.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class MySecurityConfig {
@Bean
public InMemoryUserDetailsManager users() {
UserDetails user = User.builder()
.username("user")
.password("{noop}123456") // {noop} 表示明文密码,生产环境应加密
.roles("USER")
.build();

UserDetails admin = User.builder()
.username("admin")
.password("{noop}admin123")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
}
📌 注意:Spring 5.7 后,必须为密码指定编码方式。这里我们使用 {noop} 来跳过加密,只是为了测试方便。
第二步:配置安全规则
接着我们要告诉 Spring Security:
- 哪些路径要保护?
- 是否允许匿名访问?
- 登录页面怎么显示?
继续在同一个配置类中添加以下方法:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll() // 首页无需登录
.requestMatchers("/admin/**").hasRole("ADMIN") // /admin开头需 ADMIN 角色
.anyRequest().authenticated() // 其它请求需登录
)
.formLogin(login -> login
.loginPage("/login") // 自定义登录页面(后续可选)
.permitAll()
)
.logout(logout -> logout.permitAll());
return filterChain.build();
}
现在我们已经设定好了:
- 首页任何人都可以访问
/ /admin/**只有 admin 用户可以访问- 其他页面都要登录
第三步:创建控制器(Controller)
新建一个 HomeController.java,用于展示不同页面:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
@GetMapping("/login")
public String login() {
return "login"; // 将来自定义登录页面
}
@GetMapping("/admin/dashboard")
public String adminDashboard() {
return "admin dashboard";
}
}
现在访问 / 页面,应该可以直接看到内容;但访问 /admin/dashboard 会被重定向到登录页面。
第四步:运行并测试应用
启动应用:
点击 Run > Run 'Application'
测试链接:
- 访问:http://localhost:8080 —— 成功打开首页
- 访问:http://localhost:8080/admin/dashboard —— 会跳转到默认登录页面
使用如下账户尝试登录:
| 用户名 | 密码 | 角色 | 可否访问 /admin/** |
|---|---|---|---|
| user | 123456 | USER | ❌ |
| admin | admin123 | ADMIN | ✅ |
恭喜!你已成功搭建了一个带登录验证与角色控制的基本安全系统!
新手常见问题解答
Q1: 为什么我访问受保护的页面没有提示登录?
答:检查你的 Controller 方法是否拼写正确,或者是否被其他拦截逻辑覆盖。
Q2: 密码明明是对的,还是登录失败?
答:请确认是否启用了正确的用户配置,并确保没有拼错密码。如果使用了数据库,请检查加密算法是否一致。
Q3: 总是出现 403 错误?
答:通常是因为权限不够。检查你的 .roles() 设置是否正确。如果是表单提交,记得开启 csrf 保护。
Q4: 如何自定义登录页面?
答:你可以返回一个 HTML 文件作为登录页面,然后在配置中设置 .loginPage("/custom-login") 并创建对应的路由。
学习建议:下一步学什么?
你现在已完成一个基础的认证系统,接下来可以尝试以下进阶方向:
1. 整合数据库进行登录
- 学习 JDBC、JPA、MyBatis 等持久化框架
- 实现动态用户加载与角色管理
2. 使用加密密码
- 替换
{noop}为你自己的加密策略,如 BCryptPasswordEncoder
3. 增加第三方登录
- 例如整合 GitHub、微信、QQ 登录(OAuth2)
4. 实现 JWT Token 认证(无状态登录)
- 常用于移动端或前后端分离项目
- 结合 Spring Security 和 JWT 库实现
5. 加入更复杂的权限控制
- 基于权限点(authority)而非角色(role)控制
- 使用方法级别的注解控制权限
总结
在本教程中,你学会了:
✅ Spring Security 的基本概念
✅ 如何搭建一个安全登录系统
✅ 如何通过角色限制访问权限
✅ 常见问题和初步解决方案
Spring Security 并不可怕,关键是动手实践、逐步扩展。
继续加油,安全防护之路才刚刚开始 👍
💡 Tips:所有代码均可在 GitHub 上找到完整示例,欢迎 fork & star!
如有疑问,也欢迎留言交流~

评论 0