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

对于刚接触后端开发的新手朋友来说,Spring Security 可能听起来有点陌生。别担心,它其实是一个非常强大的工具,用来帮助我们在 Java 应用中实现用户登录、权限控制和访问保护等功能。
想象一下你做了一个博客网站,你想让只有注册了的用户才能发文章,而访客只能看不能发;或者你想给管理员一个专门的后台页面,其他人访问不了。这些功能就是 Spring Security 帮我们实现的。
换句话说:
Spring Security 就是你的 Java Web 应用的“保安”或“门卫”,负责识别谁在访问,判断他们能不能进某个页面或执行某些操作。
这个框架虽然功能强大,但入门并不难。这篇文章会带你从零开始,一步一步地搭建一个简单但完整的安全认证系统。
环境准备:你需要准备什么?

要使用 Spring Security,我们需要先准备好基本的开发环境。这里我们以最简单的 Spring Boot 项目为例,因为它可以自动帮我们集成 Spring Security。
1. 安装 JDK
确保你已经安装了 Java 开发工具包(JDK)。推荐使用 JDK 17 或以上版本,可以在官网下载安装:Oracle JDK 或 OpenJDK。
检查是否安装成功:
java -version
2. 安装 IntelliJ IDEA(推荐)
IntelliJ IDEA 是一款优秀的 Java IDE,社区版免费。可以从官网下载安装:https://www.jetbrains.com/idea/download/
也可以使用 Eclipse 或 VS Code,但推荐新手用 IDEA,因为它对 Spring 项目支持很好。
3. 创建 Spring Boot 项目
我们可以使用 Spring Initializr 来创建项目:
选择以下配置:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新稳定版(如 3.0.x)
- Group: com.example
- Artifact: demo-security
- Name: DemoSecurityApplication
- Packaging: Jar
- Java Version: 17
然后添加依赖项:
- Spring Web
- Spring Security
点击【Generate】下载压缩包并解压。
4. 导入项目到 IntelliJ IDEA
打开 IDEA → “File” → “New” → “Project from Existing Sources” → 找到解压后的项目文件夹 → 选择 Maven 项目 → 一步步导入即可。
完成后,你应该能看到如下结构:
src
├── main
│ ├── java
│ │ └── com.example.demosecurity
│ │ ├── DemoSecurityApplication.java
│ │ └── controller
│ │ └── HomeController.java (需要自己创建)
│ └── resources
│ └── application.properties
└── test
到这里,我们的开发环境就准备好了!
核心概念:你必须知道的几个关键词

为了更好地理解 Spring Security 的工作原理,我们需要了解几个关键概念:
1. 用户认证(Authentication)
通俗解释:用户登录的过程就是认证。
也就是验证用户是不是他们声称的那个人。常见的做法是输入用户名和密码来完成认证。
2. 用户授权(Authorization)
通俗解释:确定已登录的用户能否执行某个操作。
比如:普通用户只能查看文章,不能发布;管理员可以修改和删除文章。
3. 登录页面(Login Page)
如果你没有自己写登录页,Spring Security 默认会提供一个简单的登录界面供你使用。
4. 安全配置类(Security Config)
这个类是我们用来告诉 Spring Security 如何进行安全设置的地方。比如哪些页面需要登录、登录后的跳转路径、允许哪些用户访问等。
实战项目:一步步搭建安全认证系统
接下来我们要做一个完整的安全认证流程,包括:
- 添加主页、受限页面
- 配置登录页面
- 创建用户和角色
- 设置不同权限的访问控制
第一步:创建控制器 HomeContoller.java
在 src/main/java/com/example/demosecurity/controller 目录下新建一个控制器类:
package com.example.demosecurity.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "index"; // 返回 templates 下的 index.html 文件
}
@GetMapping("/user")
public String userPage() {
return "user"; // 返回 templates 下的 user.html
}
@GetMapping("/admin")
public String adminPage() {
return "admin"; // 返回 templates 下的 admin.html
}
}
第二步:创建 HTML 页面
由于我们用了 Thymeleaf 模板引擎(Spring Boot 默认自带),在 resources/templates/ 下创建页面:
index.html(主页)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>首页</title>
</head>
<body>
<h1>欢迎来到首页</h1>
<a href="/user">普通用户页面</a><br>
<a href="/admin">管理员页面</a>
</body>
</html>
user.html(普通用户页面)
<h1>这是普通用户的专属页面</h1>
admin.html(管理员页面)
<h1>这是管理员页面</h1>
第三步:配置安全规则 SecurityConfig.java
新建一个类 SecurityConfig.java:
package com.example.demosecurity.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.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
var manager = new InMemoryUserDetailsManager();
// 添加一个用户,用户名 user,密码 user123,角色 USER
manager.createUser(User.withUsername("user")
.password("{noop}user123") // {noop} 表示明文存储
.roles("USER")
.build());

// 添加一个管理员,用户名 admin,密码 admin123,角色 ADMIN
manager.createUser(User.withUsername("admin")
.password("{noop}admin123")
.roles("ADMIN")
.build());
return manager;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll()
.requestMatchers("/user").hasRole("USER")
.requestMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated())
.formLogin(form -> form
.loginPage("/login") // 自定义登录页面,我们现在还没做,所以暂时注释掉
.permitAll())
.logout(logout -> logout.permitAll());
return http.build();
}
}
目前我们先不自定义登录页面,这样 Spring 会自动给我们一个默认的登录页。
第四步:测试运行
启动项目,访问:
http://localhost:8080/
点击进入 /user 页面时,会自动跳转到登录页:
http://localhost:8080/login
这时你可以尝试输入:
- 用户名:user
- 密码:user123
或者:
- 用户名:admin
- 密码:admin123
看看是否可以分别访问 /user 和 /admin 页面。
现在你就完成了第一个安全认证系统的基本搭建!
常见问题解答
Q1:为什么我输入正确的用户名和密码也登录不了?
可能原因:
- 密码没加
{noop},导致 Spring 认为你是用加密存储方式,但实际上你用了明文。 - 忘记启用
.formLogin()功能。 - 浏览器缓存了旧的登录状态,建议清除缓存或换浏览器试试。
✅ 解决方案:
确认你的用户配置里密码前面有 {noop}:
.password("{noop}user123")
Q2:我想用数据库里的用户登录怎么办?
目前我们用的是内存中的用户(InMemoryUserDetailsManager),如果要用数据库,后面可以接入 Spring Data JPA + 数据库,再自定义 UserDetails 服务。我们会在后续教程中讲解。
Q3:登录页报错“Bad credentials”是什么意思?
意味着用户名或密码错误。请仔细核对你在代码中创建的用户信息,并确认输入无误。
学习建议:下一步该学什么?
恭喜你完成了 Spring Security 的第一步!下面是给你的一些建议,帮助你继续深入学习:
✅ 掌握更多安全配置技巧
- 自定义登录页面
- 登录成功/失败回调处理
- 多种角色权限控制策略
- 限制同时在线人数
✅ 接入真实数据库
- 使用 MySQL / PostgreSQL 存储用户信息
- 使用 Spring Data JPA 查询用户信息
- 加密存储密码(如 BCryptPasswordEncoder)
✅ 进阶内容(按兴趣选择)
- JWT 认证与 OAuth2
- 方法级别的权限控制(@PreAuthorize)
- 防止跨站请求伪造(CSRF)
- 安全日志记录和审计功能
总结回顾
在这篇文章中,我们一起完成了以下几个重要步骤:
- 介绍了什么是 Spring Security 及其作用;
- 准备了开发环境,创建了 Spring Boot 项目;
- 理解了认证、授权等核心概念;
- 实战搭建了一个具有登录、权限控制的安全应用;
- 解答了一些初学者常见问题;
- 提出了进一步学习的方向建议。
后续计划建议
如果你觉得收获不错,可以尝试:
- 把今天的内容重复练习一次,加深记忆
- 尝试加入“退出登录”按钮
- 给登录页面加上样式,提升用户体验
- 尝试接入真实的 MySQL 数据库管理用户
下一篇文章我会带你一步步接入数据库,实现更贴近实战的安全系统。敬请期待 🚀
📌 提示:所有源码都可以在 GitHub 上找到(假设有)
如需获取完整源码或配套资源,请关注本公众号 / 个人博客。

评论 0