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

你可能已经听说过“登录”、“权限控制”这样的词语。比如,你在网站上输入账号密码后才能访问某些页面,这就是所谓的“安全控制”。
Spring Security 就是 Java 世界中一个非常常用的、用来做安全控制的框架。它可以:
- 控制谁能登录你的系统;
- 判断用户有没有权限访问某个功能;
- 管理用户的角色(比如普通用户、管理员等);
它就像是一把“门锁”,帮你保护你开发的应用程序。
本教程适合完全没有接触过 Spring Security 的初学者。我们会从零开始,通过一个小项目带你认识它的基本用法。
环境准备:你需要安装哪些东西?


在开始之前,先准备好开发环境:
1. 安装 JDK(Java Development Kit)
推荐使用 JDK 8 或以上版本。你可以去官网 Oracle JDK 或者 OpenJDK(如 Adoptium)下载安装。
安装完成后,在命令行中执行:
java -version
确保能输出类似如下内容:
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment ...
2. 安装 IDE(推荐 IntelliJ IDEA)
IntelliJ IDEA 是一个非常适合 Java 开发的编辑器。我们建议选择 Community 版本,它是免费的。
下载地址:JetBrains IntelliJ IDEA 下载页
3. 创建一个 Spring Boot 项目
访问 Spring Initializr 创建一个新的 Spring Boot 项目:
- Project: Maven
- Language: Java
- Spring Boot Version: 2.x 或 3.x 都可以(根据你的 JDK 来定)
- Dependencies:
- Spring Web
- Spring Security
点击 “Generate” 下载压缩包,解压并导入到 IntelliJ IDEA 中。
这样我们就有了最基本的开发环境啦!
核心概念:Spring Security 关键术语解释
我们来了解几个最常见的概念,用生活中的例子类比说明:
| 技术术语 | 生活比喻 | 含义 |
|---|---|---|
| 用户(User) | 公司员工 | 访问系统的个体 |
| 登录(Login) | 刷门禁卡进入公司 | 提供身份凭证的过程 |
| 角色(Role) | 职位,比如普通员工、经理 | 表示权限范围 |
| 权限(Authority) | 允许访问某些资源,比如查看报表、发布文章 | 更细粒度的权限控制 |
| 安全配置(Security Config) | 公司保安制定的规则手册 | 通过代码定义如何控制权限 |
这些概念会在下面的实战中一一出现。
实战项目:做一个登录 + 权限控制的小系统
我们将创建一个简单的 Web 应用,实现以下功能:
- 有两个用户:user 和 admin
- user 只能访问
/hello页面 - admin 可以访问
/hello和/admin
第一步:添加依赖
我们在 pom.xml 文件中已经加入了 Spring Security 的依赖,如果你没加,请补上:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
保存后会自动下载所需库。
第二步:创建控制器 Controller
新建一个 Java 类,命名为 HelloController.java:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "你好,这里是公开信息";
}
@GetMapping("/admin")
public String admin() {
return "欢迎管理员!这里是高级区域";
}
}
现在运行程序,默认端口是 8080。你访问 http://localhost:8080/hello 会发现弹出一个登录界面,这是 Spring Security 默认提供的功能。
默认用户名是 user,密码在启动时会在控制台打印出来:
Using generated security password: abcd1234
尝试用这个用户名和密码登录。
第三步:配置用户信息
默认是随机生成一个用户。我们来自己配置两个用户:user 和 admin。
新建一个 Java 类,命名为 SecurityConfig.java:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 配置内存中的用户信息
auth.inMemoryAuthentication()
.withUser("user").password(passwordEncoder().encode("123")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("123")).roles("ADMIN");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // 密码加密
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/hello").hasAnyRole("USER", "ADMIN") // 所有用户都能访问
.antMatchers("/admin").hasRole("ADMIN") // 仅管理员可访问
.anyRequest().authenticated()
.and()
.formLogin() // 使用默认登录表单
.and()
.logout().permitAll();
}
}
这段代码做了几件事情:
- 设置了两个用户:user 和 admin,各自有不同的角色
- 给不同的 URL 设置访问权限
- 使用表单登录方式
- 对密码进行了加密处理(使用
BCryptPasswordEncoder)
第四步:测试不同用户访问权限
重启项目后:
- 用 user 用户登录(密码 123),访问:
- 成功打开
/hello - 访问
/admin会出现 “Forbidden” 错误
- 成功打开
- 用 admin 用户登录(密码 123),访问:
/helloOK/admin也能正常访问
恭喜!你已经完成了一个基本的安全控制系统!
常见问题解答(FAQ)
问题 1:我启动后不知道默认密码在哪看?
答:请仔细检查控制台输出,你会看到一行类似:
Using generated security password: abcdefg123456
那就是自动生成的默认密码。不过,建议像我们上面一样自定义账户更方便管理。
问题 2:为什么我设置了用户但总是登录失败?
答:请确认你是否正确地给密码用了加密方法。例如:
错误写法:
.withUser("user").password("123").roles("USER")
正确写法:
.withUser("user").password(passwordEncoder().encode("123")).roles("USER")
如果你漏掉了 .encode(),就会永远登不进去。
问题 3:我能自定义登录页面吗?
当然可以!我们只是用了默认的登录页。要替换为你自己的 HTML 页面,需要在配置中加上:
.formLogin().loginPage("/my-login") // 自定义登录页面路径
然后编写一个 Controller 返回 HTML 页面即可。
问题 4:如何退出登录?
只要访问 /logout 即可。Spring Security 默认开启了退出接口。你可以自己写个链接或按钮触发。
学习建议:下一步怎么学?
你已经完成了基础部分的学习,可以继续深入学习以下几个方向:
✅ 推荐学习路线
| 学习阶段 | 推荐内容 |
|---|---|
| 第一阶段(入门) | 本文内容已覆盖 |
| 第二阶段(进阶) | 自定义登录页面、记住我、CSRF防护、RBAC权限设计 |
| 第三阶段(数据库集成) | 集成 MySQL,将用户信息存在数据库中 |
| 第四阶段(OAuth2 / JWT) | 学习基于令牌的身份验证,如用于前后端分离、微服务场景 |
🔍 推荐学习资源
- 官方文档:https://docs.spring.io/spring-security/reference/html/
- B站视频:搜索 “Spring Security 教程”
- 书籍推荐:《Spring Security 实战》
结语
这篇教程只是一个起点,Spring Security 的功能远不止这些。但它足够让你跨过那道门槛,迈出第一步。
记住一句话:安全是每个应用的基础,而 Spring Security 是 Java 工程师必备的技能之一。
只要你坚持边学边练,相信很快就能掌握这个强大的工具!
如果你喜欢这种实践导向的风格,也欢迎关注更多后续的 Spring 系列教程 😊

评论 0