Spring Security基础:快速搭建安全认证系统
一、开篇:什么是Spring Security,它能做什么?
你有没有想过,当你登录一个网站时,为什么只有输入了正确的用户名和密码才能进入个人主页?这个功能是怎么实现的呢?其实这背后就是“权限管理”在起作用。
Spring Security 是 Java 后端开发中非常流行的一个安全框架,专门用来为 Web 应用添加用户登录、权限控制等功能。你可以把它想象成一个“门卫”,它负责:
- 检查谁来访问(认证)
- 决定能不能进哪个房间(授权)
无论你是想做一个博客系统、电商后台、还是企业内部系统,只要涉及“谁可以访问什么资源”的问题,Spring Security 都是你不可或缺的好帮手!
二、环境准备:我们需要哪些工具?
我们先来准备好开发环境,这是写代码的第一步。别担心,步骤很清晰,跟着做就能完成。

所需工具清单:
| 工具 | 版本建议 | 用途说明 |
|---|---|---|
| JDK | 17 或以上 | Java 开发环境 |
| IntelliJ IDEA 或 Eclipse | 社区版即可 | 编写Java代码的编辑器 |
| Maven | 自带于IDE | 项目依赖管理工具 |
| Spring Boot Initializr 网站 | start.spring.io | 快速创建Spring Boot项目 |
创建项目步骤:
打开浏览器,访问 https://start.spring.io
填写以下信息:
- Project: Maven
- Language: Java
- Spring Boot Version: 3.x(例如 3.1)
- Group:
com.example - Artifact:
security-demo - Name: 可默认
- Packaging: Jar
- Java version: 17
点击 “Add Dependencies”,搜索并添加以下两个依赖:
- Spring Web
- Spring Security
点击 “Generate”,下载压缩包
解压文件夹后,使用 IntelliJ IDEA 或 Eclipse 导入该 Maven 项目。
🎉 到此为止,你的开发环境就准备好了!接下来就开始我们的实战部分啦~
三、核心概念:这些术语别怕,我帮你解释清楚!
很多初学者看到“认证”、“授权”、“Filter”等词就头疼。没关系,我们来把它们变成白话。
1. 认证(Authentication)——你能进来吗?
认证就像是门口站着的保安叔叔,他会问:“你是谁?请出示身份证。”
在程序中就是:用户提供用户名和密码,系统验证是否正确。
✅ 如果正确 → 放行
❌ 如果错误 → 拒绝访问
2. 授权(Authorization)——你能看哪一部分?
授权就像公司大楼里的部门划分。即使你进了公司(通过了认证),也不能随便进技术部办公室,除非你有权进去。
在程序中就是:根据你的身份,判断你是否有权访问特定的资源或接口。
比如:
- 普通用户只能查看文章
- 管理员还可以发布、删除文章
3. Filter(过滤器)——拦路检查的小关卡
在请求到达服务器之前,有一系列“门岗”会拦截请求进行检查。比如说,是否已经登录?有没有权限访问某个接口?
Spring Security 就是通过这一连串的 filter 实现安全机制的。
四、实战项目:从零开始搭建一个简单的安全系统
现在我们要做一个最简单的 Spring Boot 安全应用,包括:
- 用户登录页面
- 登录成功后访问
/hello - 未登录用户不能访问
/hello
步骤1:添加基本安全配置类
在 src/main/java/com/example/securitydemo/config 文件夹下,新建一个类叫做 SecurityConfig.java
package com.example.securitydemo.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.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 userDetailsManager() {
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 securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests
.requestMatchers("/hello").authenticated() // /hello需要登录才能访问
.anyRequest().permitAll() // 其他路径都可以直接访问
)
.formLogin(); // 启用默认登录界面
return http.build();
}
}
这段代码做了几件事:
- 在内存中创建了两个用户:
user/123456和admin/admin123 - 设置了
/hello路径必须登录才能访问 - 开启了默认的登录表单页面
步骤2:编写一个简单接口测试效果
新建一个 HelloController.java
package com.example.securitydemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "你好,欢迎来到受保护的页面!";
}
}
步骤3:启动项目测试
运行主类(通常是 SecurityDemoApplication.java)
访问地址:
👉 浏览器打开:http://localhost:8080/hello
你会自动跳转到 Spring Security 默认的登录页面:

使用我们定义的用户名和密码登录即可看到“你好……”这条消息。
五、常见问题解答:新手可能会遇到的问题及解决方法
Q1:报错提示密码不符合要求?
错误信息类似:
A UserDetailsService must be configured...
可能是你在使用 .withDefaultPasswordEncoder() 方法时,Spring 新版本对明文密码的安全性要求更高了。
✅ 解决方法:
换成 BCrypt 加密方式(更安全),或者临时加上下面的 Bean 来允许明文密码(仅用于学习):
@Bean
public PasswordEncoder passwordEncoder() {
return org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance();
}
⚠️ 注意:NoOpPasswordEncoder 不能用于生产环境!
Q2:访问页面一直重定向到登录页?
确认你是否配置了 .formLogin() 并且没有遗漏路径设置。
确保:
.authorizeHttpRequests( ... )
.formLogin()
Q3:忘记关闭 CSRF 防护?
默认启用的 CSRF 保护可能影响 POST 请求。
如果你暂时不想处理这个问题,可以在配置中禁用它:
http.csrf(csrf -> csrf.disable());
不过正式项目不建议这样操作。
六、学习建议:下一步应该学什么?

你现在掌握了:
- 如何配置 Spring Security 的基本安全
- 如何创建内存用户
- 如何限制访问某些路径
- 如何开启登录页面
那接下来可以沿着以下方向继续深入学习:
1. 进阶功能模块
- 使用数据库验证用户(JDBC、MyBatis、Spring Data JPA)
- 角色权限区分(例如 ROLE_ADMIN 才能访问
/admin/**) - 自定义登录页面、登录成功回调
- 注解式权限控制(如
@PreAuthorize("hasRole('ADMIN')"))
2. 安全协议与标准
- OAuth2 协议简介与集成 GitHub、微信登录
- JWT(Json Web Token) 实现无状态认证
- HTTPS 基本原理与配置
3. 安全漏洞防护知识
- XSS 跨站脚本攻击
- CSRF 跨站请求伪造攻击
- SQL 注入防御机制
总结一下
本文带你快速入门了 Spring Security,从零搭建了一个带有登录认证的功能。不要被“安全”两个字吓住,只要你动手写一次,就能发现它其实并不难。
记住一句话:“多练比多看更重要!”
✅ 实践是检验真理的唯一标准,赶紧动手试试吧!
如果你觉得这篇文章对你有帮助,请分享给更多正在学习 Spring Security 的同学;也可以留言告诉我你接下来最想知道的内容,我会持续更新教程!💪

评论 0