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

Spring Security 是一个基于 Java 的安全框架,主要用于在 Web 应用程序中实现用户登录、权限控制等安全管理功能。你可以把它理解为给你的网站“加锁”的工具。
比如说你想做一个博客网站:
- 只有注册用户才能发表文章
- 普通用户只能查看文章
- 管理员可以删除评论
这些权限管理的工作,都可以通过 Spring Security 快速实现。
环境准备:搭建开发环境

为了使用 Spring Security,我们需要准备好以下开发环境:
1. 安装 JDK(Java 开发工具包)
推荐安装版本:JDK 8 或以上
下载地址:https://www.oracle.com/java/technologies/javase-downloads.html
安装完成后,打开命令行输入:
java -version
如果有类似如下输出,说明安装成功:
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment Zulu17.34+19-CA (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM Zulu17.34+19-CA (build 17.0.1+12-LTS, mixed mode)
2. 安装 IntelliJ IDEA(IDE)
推荐使用社区版(免费):
下载地址:https://www.jetbrains.com/idea/download/
3. 创建 Spring Boot 项目
访问 https://start.spring.io/ 创建一个新的 Spring Boot 项目:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新稳定版
- Dependencies: Spring Web + Spring Security
点击 “Generate” 下载生成的项目压缩包。
解压后,用 IntelliJ 打开该项目即可开始编码。
核心概念:Spring Security 中的关键角色

学习任何一个框架,先了解几个核心概念很重要。
| 概念 | 解释 |
|---|---|
| UserDetails | 描述用户的详细信息,比如用户名、密码、角色等 |
| Authentication | 表示一个认证对象,包含当前登录的用户信息 |
| SecurityFilterChain | 过滤器链,用于拦截请求并进行安全控制 |
| Role / Authority | 角色与权限的区别:角色是分类,权限是具体操作 |
小贴士:可以把 Role 理解成“职位”,Authority 是“权利”
实战项目:构建一个简单的登录认证系统
我们来一步一步地搭建一个支持登录验证的 Web 系统。最终效果是:
- 未登录用户只能访问
/hello页面 - 登录后可以访问
/secure页面
第一步:添加依赖
确保 pom.xml 中包含以下两个依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
保存后,IDEA 会自动下载相关 jar 包。
第二步:创建控制器类
新建 HelloController.java:
import org.springframework.web.bind.annotation.*;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "大家好!欢迎来到安全世界";
}
@GetMapping("/secure")
public String secure() {
return "这是受保护的页面,请登录后再查看";
}
}
此时启动应用,访问 /secure 会被强制跳转到登录页(由 Spring Security 自动生成)。
默认用户名和密码会在控制台打印出来(例如:user / 123456),你也可以自定义账号信息。
第三步:配置安全策略(重点)
新建一个配置类 SecurityConfig.java:
import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.web.builders.*;
import org.springframework.security.config.annotation.web.configuration.*;
import org.springframework.security.core.userdetails.*;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
// 设置内存中的用户
@Bean
public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder.encode("123"))
.roles("USER") // 角色
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder.encode("123"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
// 配置安全规则
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/hello").permitAll() // 允许所有人访问
.requestMatchers("/secure").authenticated() // 认证后才能访问
)
.formLogin(withDefaults()); // 启用默认表单登录页面
return http.build();
}
// 密码加密方式
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
这段代码做了三件事:
- 在内存中定义了两个用户:user 和 admin
- 配置了哪些路径需要认证,哪些不需要
- 使用 BCrypt 加密方式存储密码(更安全)
第四步:运行测试
启动应用后,在浏览器中访问:
http://localhost:8080/hello—— 不用登录也能访问 ✅http://localhost:8080/secure—— 自动跳转到登录页 ➕ 输入用户名密码后访问 ✅
常见问题:新手遇到的问题及解决方案
❓1. 为什么我设置了用户,但还是无法登录?
可能原因:
- 用户名或密码拼写错误(区分大小写)
- 角色没有正确配置
- 没有启用
formLogin()方法
建议检查日志输出,看是否有“Authentication failed”之类的提示。
❓2. 怎么关闭 CSRF 保护?开发时总报错。
Spring Security 默认启用 CSRF 保护机制。如果你在测试阶段想临时禁用:
.csrf(csrf -> csrf.disable())
注意:这只是为了测试,不要在生产环境中关闭!
❓3. 可以不弹出登录页面吗?
可以换成 REST 接口登录。我们可以通过自定义登录逻辑来实现无页面登录(进阶内容),后面可以继续学习 JWT、OAuth2 等方式。
学习建议:下一步该学什么?
恭喜你完成了第一个安全系统的搭建!
接下来你可以尝试:
- 把用户信息存入数据库(MySQL、PostgreSQL)
- 使用 JWT 实现无状态认证
- 添加角色权限控制
- 对接 OAuth2 第三方登录(如 GitHub、微信)
Spring Security 是个庞大而强大的工具包,但只要你从最简单的例子入手,逐步深入,就一定能掌握它的精髓。
希望这篇教程对你理解 Spring Security 有所帮助!下一站目标:搭建完整的用户权限系统 🚀

评论 0