零基础也能搞定:用Spring Security快速搭建Java安全认证系统
大家好,我是掘金上常写教程的全栈工程师。最近在带实习生时发现,很多刚接触后端开发的同学对“用户登录”这件事既熟悉又陌生——天天用App登录,但自己写却无从下手。尤其是看到 Spring Security 这个名字,总觉得高深莫测。
其实,Spring Security 并没有那么可怕。我当初学的时候也踩过不少坑,比如配置完连页面都打不开、密码明明对却一直报错……今天这篇教程,就是想用最直白的方式,带你从零开始搭建一个带用户名密码登录的安全系统,哪怕你今天才第一次听说“认证”这个词,也能跟着做完。
为什么需要 Spring Security?
想象一下:你的网站有后台管理页面,只有管理员才能进;普通用户注册后能看自己的订单。如果没做任何保护,黑客随便改个 URL 就能访问别人的数据——这显然不行。
Spring Security 就是 Java 生态中最主流的安全框架,它帮你自动处理:
- 用户登录/登出
- 密码加密存储
- 权限控制(谁可以访问哪个接口)
- 防止 CSRF、XSS 等常见攻击
而你要做的,只是写几行配置代码。
开发环境准备(5分钟搞定)
确保你已安装以下工具:
| 工具 | 版本建议 | 用途 |
|---|---|---|
| JDK | 17 或 21 | Java 运行环境 |
| Maven | 3.6+ | 项目依赖管理 |
| IDE | IntelliJ IDEA(推荐) | 编码工具 |
| Spring Boot | 3.x | 快速构建应用 |
💡 运营小贴士:作为开发者,别忽视环境一致性。建议团队统一 JDK 和 Spring Boot 版本,避免“在我电脑上能跑”的尴尬。
创建项目
打开 Spring Initializr,选择:
- Project: Maven
- Language: Java
- Spring Boot: 最新版(如 3.2.x)
- Dependencies: Spring Web, Spring Security
下载后导入 IDE,项目结构如下:
src/
└── main/
├── java/
│ └── com.example.demo/
│ └── DemoApplication.java
└── resources/
└── application.properties
核心概念三句话讲清楚
新手最容易被术语吓到,其实就三个核心:
- Authentication(认证):你是谁?→ 输入用户名密码登录
- Authorization(授权):你能干什么?→ 管理员能删用户,普通用户不能
- PasswordEncoder(密码编码器):密码不能明文存!必须加密(如 BCrypt)
✅ 开发心得:永远不要自己实现密码加密逻辑!直接用 Spring Security 提供的
BCryptPasswordEncoder,安全又省事。
实战:搭建一个带登录页的简单系统
我们目标:启动项目后,访问 /admin 需要登录,且只有 admin 用户能进。
第一步:添加必要依赖(pom.xml 已包含)
Spring Initializr 已自动加上:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
第二步:配置内存用户(快速测试用)
在主类同包下新建 SecurityConfig.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 admin = User.builder()
.username("admin")
.password("{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk7fL5u") // 密码:123456
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(admin);
}
@Bean
public SecurityFilterChain filterChain(Http security) throws Exception {
security
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页路径
.permitAll() // 登录页无需认证
)
.logout(logout -> logout
.permitAll()
);
return security.build();
}
}
🔒 密码说明:上面的密文是用 BCrypt 加密
123456得到的。你也可以在测试时用{noop}123456(不加密),但生产环境绝对禁止!
第三步:创建控制器和页面
新建 WebController.java:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class WebController {
@GetMapping("/login")
public String login() {
return "login"; // 返回 templates/login.html
}
@GetMapping("/admin")
@ResponseBody
public String adminPage() {
return "欢迎,管理员!";
}
}
在 resources/templates 下创建 login.html(需先加 Thymeleaf 依赖):
<!-- 简易登录页 -->
<form action="/login" method="post">
用户名: <input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<button type="submit">登录</button>
</form>
⚠️ 别忘了在
pom.xml加 Thymeleaf:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
第四步:启动并测试
- 运行
DemoApplication.main() - 浏览器访问
http://localhost:8080/admin - 自动跳转到
/login - 输入用户名
admin,密码123456 - 成功进入管理员页面!
新手常见问题 & 解决方案
❌ 问题1:启动后自动生成一串随机密码?
这是 Spring Security 的默认行为(当你没配用户时)。解决方案:务必自定义 UserDetailsService,如上文所示。
❌ 问题2:登录后还是跳回登录页?
检查三点:
- 密码是否加密?明文密码需加
{noop}前缀(仅测试!) - 表单字段名是否为
username和password?(Spring Security 默认这么取) - 是否漏了
.permitAll()导致登录页也被拦截?
❌ 问题3:如何放行首页或静态资源?
在 authorizeHttpRequests 中加规则:
.requestMatchers("/", "/css/**", "/js/**").permitAll()
下一步学习建议
你现在已掌握 Spring Security 的“最小可行系统”。接下来可深入:
- 连接数据库:用
JdbcUserDetailsManager或自定义UserDetailsService查询 MySQL 用户 - JWT 无状态认证:适合前后端分离项目(如 Vue + Spring Boot)
- OAuth2 集成:支持微信/Google 第三方登录
- 权限粒度细化:基于方法(
@PreAuthorize)或数据行级控制
📌 避坑指南:不要一上来就学 OAuth2 或 JWT!先把表单登录搞透,理解过滤器链(Filter Chain)机制,后面学新东西会快十倍。
写在最后
作为从零开始一路摸爬滚打过来的工程师,我深知初学者面对安全框架时的焦虑。但请相信:所有复杂系统,都是由简单模块堆叠而成。今天你搭的这个小系统,就是未来企业级认证体系的雏形。
运营一个产品,安全是底线;开发一个系统,认证是起点。希望这篇教程能成为你 Java 安全之路的第一块垫脚石。
有问题欢迎在评论区留言,我会一一解答。下次见!

评论 0