Spring Security基础:快速搭建安全认证系统
一、开篇:Spring Security是什么?我们为什么需要它?

在开发网站或者应用程序时,用户的安全性是非常重要的一个方面。我们总希望知道“谁”在使用我们的系统,他们有哪些权限,并且确保没有非法用户偷偷进入。
Spring Security 就是一个帮助我们实现这些功能的工具。它是 Java 领域中非常流行的权限管理框架,可以让我们轻松地为自己的 Web 应用程序添加登录、权限控制等功能。
比如说:
- 用户必须登录才能访问某些页面
- 普通用户和管理员拥有不同的操作权限
- 登录失败多次后暂时锁定账户等机制
如果你正在学习后端开发,特别是使用 Spring Boot 进行开发,那么掌握 Spring Security 是一项必备技能。
二、环境准备:构建你的开发环境

为了开始学习 Spring Security,我们需要准备好以下开发环境:
1. Java 开发环境
推荐使用 JDK 8 及以上版本(建议 JDK 17),你可以前往 Oracle官网 或者使用 OpenJDK 下载安装。
确认是否安装成功,在终端输入:
java -version
输出类似如下内容即可说明已安装好 JDK:
openjdk version "17.0.4" 2022-07-19
2. IDE(集成开发环境)
建议使用 IntelliJ IDEA(社区版或 Ultimate 版)或者 Eclipse + Spring Tools Suite 插件。
- IntelliJ IDEA 官网下载地址: https://www.jetbrains.com/idea/download/
- Eclipse 官网:https://www.eclipse.org/downloads/
3. 创建一个新的 Spring Boot 项目
可以通过 Spring Initializr 快速生成初始项目结构。
配置如下:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新稳定版(例如 3.x)
- Dependencies: Spring Web、Spring Security
点击 Generate 下载项目 ZIP 文件并解压到本地。
解压后,打开项目导入 IDE 中运行。
三、核心概念:从零理解关键术语
虽然 Spring Security 功能强大,但入门时只要理解几个基本概念就足够了。
1. 认证(Authentication)
简单来说,就是:“你是谁?”
比如你在某个网站上输入用户名和密码登录,就是在做认证。
2. 授权(Authorization)
是指你被允许做什么事。“你能访问哪些资源?”
比如管理员可以删除文章,普通用户只能阅读。
3. 主体(Principal)
表示当前登录用户的身份信息。
4. 角色(Role)与权限(Authority)
- 角色是用户的分组身份,如 ROLE_USER、ROLE_ADMIN。
- 权限比角色更细粒度,例如 read_article、delete_post。
四、实战项目:一步步搭建最简单的登录系统
下面我们通过实践的方式,一步步搭建一个只有登录功能的小应用。
步骤1:添加依赖
在你的 pom.xml 文件中确保已经引入了以下两个依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
注意:添加完之后,Spring Boot 会默认启用基本的安全保护。比如所有接口都会需要登录才能访问!
步骤2:创建配置类 SecurityConfig.java
接下来我们创建一个配置类来定制安全规则。
在 src/main/java 的主包下新建类:
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 SecurityConfig {
// 配置用户和服务验证
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("123456")
.roles("USER")
.build();

UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("admin123")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
// 配置请求权限规则
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.anyRequest().authenticated()) // 所有请求都需要登录
.formLogin(); // 启用表单登录页面
return http.build();
}
}
这段代码做了两件事:
- 在内存里设置两个用户:
- 用户名:user / 密码:123456 → 拥有 ROLE_USER 权限
- 用户名:admin / 密码:admin123 → 拥有 ROLE_ADMIN 权限
- 设置所有请求都需要登录,并启用 Spring 提供的默认登录界面。
步骤3:添加一个测试控制器 HelloWorldController.java
新建一个控制器类用于测试能否访问受保护资源:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
@GetMapping("/")
public String helloWorld() {
return "欢迎使用 Spring Security!";
}
}
运行项目(运行 Application.java 主类),然后访问地址:
http://localhost:8080
浏览器将自动跳转到登录页面,你可以尝试用我们刚刚定义的账号登录试试。
步骤4:基于角色控制访问权限(可选扩展)
如果你想让不同角色的人看到不同的内容,我们可以继续修改控制器代码:
@GetMapping("/user-only")
public String userOnly() {
return "这是普通用户能看到的内容。";
}
@GetMapping("/admin-only")
public String adminOnly() {
return "这是管理员才能访问的内容。";
}
再修改一下安全配置,给路径加上权限限制:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin-only").hasRole("ADMIN") // 仅 ADMIN 可访问
.anyRequest().authenticated())
.formLogin();

return http.build();
}
现在 /user-only 需要登录就能看,而 /admin-only 必须登录并且是管理员角色才可以看。
五、常见问题:新手容易踩坑的地方
❓ Q1:登录总是失败,密码也正确,怎么办?
有可能你设置了编码方式,但没有正确处理密码加密。在本教程中,我们用了 .withDefaultPasswordEncoder(),这是一个方便测试的写法,适用于临时演示,不建议用于生产环境。
在真实场景中应当使用 BCryptPasswordEncoder 等加密方法处理密码。
❓ Q2:为什么访问任意网页都跳转到登录页?
因为我们在配置中写了:
.anyRequest().authenticated()
意思是所有 URL 请求都要先登录才允许访问。你可以改为自己喜欢的规则,例如:
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
这样,带有 /public 路径的资源就可以公开访问。
❓ Q3:能不能去掉自动生成的登录界面?
当然可以,只需配置登录页面链接或禁用表单登录即可:
.formLogin(form -> form
.loginPage("/my-login") // 自定义登录页面
.permitAll());
或者关闭登录页面:
.httpBasic(); // 使用 Basic Auth 方式(适合前后端分离项目)
六、学习建议:下一步该怎么做?
恭喜你完成了第一个 Spring Security 示例!这只是一个非常基础的入门级别项目。想要深入掌握这个框架,你需要进一步学习以下几个方向:
✅ 推荐学习路线
第一阶段:深入核心模块
- 学习如何使用数据库保存用户信息(整合 Spring Data JPA)
- 学习使用 BCrypt 等加密方式处理用户密码
- 学习 JWT(Json Web Token)实现无状态认证(用于 REST API)
- 实现第三方社交登录(OAuth2、微信、QQ 等)
第二阶段:实际项目中使用
- 在真实的 Spring Boot 项目中加入安全控制逻辑
- 实现 RBAC(基于角色的权限控制系统)
- 结合 Redis 缓存会话信息,提升系统并发能力
第三阶段:高级内容
- 方法级别的权限控制(@PreAuthorize / @Secured)
- 多租户架构下的安全设计
- 单点登录 SSO 系统架构设计
- Spring Security 和 Spring Cloud Gateway 集成
写在最后
学习 Spring Security 不是一蹴而就的事情,但只要你从最基础的功能开始练习,不断动手敲代码、调试,逐步积累经验,你就一定能够掌控这个强大的权限框架。
希望这篇教程能为你打下一个坚实的基础,未来无论是做企业级后台系统,还是开发高安全要求的金融类产品,Spring Security 都将成为你的得力助手。
祝你编程快乐,安全无忧!🔒
如需完整示例代码,请查看 GitHub 示例仓库(模拟地址):https://github.com/demo/spring-security-demo-basic
作者简介:一位热爱教学、有着多年 Spring 开发和培训经验的后端讲师,专注把复杂的技术通俗易懂地讲明白。

评论 0