零基础也能搞懂!Spring Security快速上手实战
大家好,我是小陈,一个在大厂干了3年后端开发的普通程序员,业余时间在B站做技术UP主。最近收到不少粉丝私信问:“我想学Spring Security,但完全不知道从哪开始!”这让我想起了自己刚入行时的窘迫——面对一堆Authentication、Authorization术语,简直像看天书。
今天这篇教程,就是为零基础小白量身打造的。我会用最直白的语言、最简单的项目,带你快速搭建一个带登录认证的安全系统。别担心看不懂,我当初也是这么一步步过来的!
小提示:虽然本文讲的是Java生态的Spring Security,但你可能会好奇:为什么标题里还有Go和Python?其实很多初学者在选语言时会纠结。这里简单说一句:如果你已经用Go或Python做了些小项目(比如爬虫、运营脚本),现在想转型后端开发,Java + Spring Boot + Spring Security 是企业级应用的黄金组合,值得投入!
一、Spring Security到底是啥?能干啥?
简单来说,Spring Security 就是给你的网站加“门禁”和“权限卡”的工具。
- 没它之前:谁都能访问你的用户信息、订单数据,甚至删除数据库。
- 有它之后:只有登录的用户才能进;管理员能看到所有数据,普通用户只能看自己的。
举个例子:
- 运营同学用后台管理系统 → 需要账号密码登录
- 用户查看个人中心 → 必须已登录
- 匿名用户只能看首页和商品列表
这就是 认证(Authentication) 和 授权(Authorization) 的作用。
二、环境准备:5分钟搭好开发环境
我们用最主流的组合:Spring Boot + Spring Security + Maven
你需要安装:
| 工具 | 版本建议 | 说明 |
|---|---|---|
| JDK | 17 或 21 | 推荐使用 LTS 版本 |
| IDE | IntelliJ IDEA | 免费社区版即可 |
| 构建工具 | Maven | Spring Initializr 会自动生成 |
创建项目(超简单!)
- 打开 https://start.spring.io
- 填写:
- Project: Maven
- Language: Java
- Spring Boot: 3.x(最新稳定版)
- Group/Artifact 随便填,比如
com.example.securitydemo
- 关键一步:在 "Dependencies" 搜索框里输入:
Spring WebSpring Security
- 点击 "Generate" 下载 ZIP,解压后用 IDEA 打开
💡 我当初第一次配环境时,因为JDK版本不对折腾了半小时。记住:Spring Boot 3 要求 JDK 17+!
三、核心概念:3个关键词搞懂安全体系
别被术语吓到,其实就三件事:
1. 认证(Authentication)→ “你是谁?”
- 输入用户名密码 → 系统验证是否正确
- 成功后给你一个“身份令牌”(比如 Session 或 JWT)
2. 授权(Authorization)→ “你能干什么?”
- 管理员可以删用户,普通用户不行
- 通过角色(ROLE_ADMIN)或权限(USER_DELETE)控制
3. 安全配置(SecurityConfig)→ “规则怎么定?”
- 哪些路径公开?哪些要登录?
- 密码怎么加密?登录页长什么样?
四、实战:5步写出你的第一个安全系统
我们做一个极简Demo:
/public:任何人都能访问/admin:必须登录且是管理员- 自定义登录页
第1步:启动就能用!默认安全已生效
运行 main 方法,访问 http://localhost:8080
你会发现:
- 自动跳转到
/login - 控制台打印了一行随机密码(类似
Using generated security password: abc123)
✅ 这就是 Spring Security 的“默认保护”——所有接口都需认证!
第2步:关闭默认,自定义规则
创建配置类 SecurityConfig.java:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public").permitAll() // 公开路径
.requestMatchers("/admin").hasRole("ADMIN") // 需ADMIN角色
.anyRequest().authenticated() // 其他都要登录
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页
.permitAll()
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
// 内存中创建两个用户(仅演示!生产要用数据库)
UserDetails user = User.builder()
.username("user")
.password("{noop}123456") // {noop}表示不加密
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password("{noop}admin123")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsService(user, admin);
}
}
⚠️ 注意:
{noop}表示明文密码,仅用于测试!后面我们会讲加密。
第3步:创建控制器和页面
@RestController
public class DemoController {
@GetMapping("/public")
public String publicPage() {
return "这是公开页面,谁都能看!";
}
@GetMapping("/admin")
public String adminPage() {
return "欢迎管理员!你可以管理一切。";
}
@GetMapping("/user")
public String userPage() {
return "普通用户专属内容。";
}
}
为了让登录页更友好,我们改用 Thymeleaf(模板引擎):
- 在
pom.xml加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 创建
src/main/resources/templates/login.html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>登录</title></head>
<body>
<h2>用户登录</h2>
<form th:action="@{/login}" method="post">
用户名: <input type="text" name="username" /><br/>
密码: <input type="password" name="password" /><br/>
<button type="submit">登录</button>
</form>
<p th:if="${param.error}" style="color:red;">用户名或密码错误!</p>
</body>
</html>
- 修改控制器,返回页面:
@Controller // 改成@Controller,不是@RestController
public class PageController {
@GetMapping("/login")
public String login() {
return "login"; // 返回templates/login.html
}
}
第4步:密码加密(重要!)
把 {noop} 去掉,使用 BCrypt 加密:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 创建用户时加密密码
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder().encode("123456")) // 加密
.roles("USER")
.build();
🔒 安全提示:永远不要在代码里写明文密码!生产环境密码必须加密存储。
第5步:测试你的系统
| 路径 | 预期结果 |
|---|---|
/public |
直接显示内容 |
/user |
跳转到登录页,用 user / 123456 登录后可访问 |
/admin |
登录后仍提示无权限(因为 user 没有 ADMIN 角色) |
| 用 admin / admin123 登录 | 可访问 /admin |
五、新手常见问题 & 解决方案
❓ 问题1:为什么登录总是失败?
- 检查密码是否用了
{noop}(测试可用,正式必须加密) - 确保用户名/密码与
UserDetailsService中一致 - 查看控制台是否有
BadCredentialsException
❓ 问题2:自定义登录页样式不生效?
- 确认方法上用的是
@Controller而不是@RestController - 模板文件放在
resources/templates/下 - 表单
action必须是/login(Spring Security 默认处理路径)
❓ 问题3:如何对接数据库?
- 实现
UserDetailsService接口 - 注入
UserService查询数据库 - 返回
UserDetails对象(包含用户名、加密密码、权限列表)
❓ 问题4:Go/Python 转 Java 会不会很难?
完全不会!虽然语法不同,但安全思想是通用的:
- Go 有
Gin + jwt-go - Python 有
Django Auth或Flask-Login - 核心都是:认证 + 授权 + 会话管理
你之前用 Python 写过运营脚本?那理解“权限控制”应该毫无压力!
六、下一步学习建议
你现在已经掌握了 Spring Security 的基础!接下来可以:
深入学习:
- JWT 无状态认证(适合前后端分离)
- OAuth2 接入微信/Google 登录
- 方法级权限控制(
@PreAuthorize)
避坑指南:
- 不要硬编码用户信息(用数据库)
- 生产环境务必开启 HTTPS
- 密码策略:至少8位,含大小写+数字
扩展思考:
- 如果你的系统是给运营团队用的,可能需要更细的权限(比如“只能导出数据,不能删除”)
- 微服务架构下,如何统一认证?(答案:网关 + Token)
最后送大家一句话:安全不是功能,而是底线。哪怕你的系统再小,也请加上基本认证。毕竟,没人希望自己的“Hello World”被黑客删库跑路 😅
如果你觉得这篇教程有帮助,欢迎去B站搜“程序员小陈”,我会持续更新更多零基础实战教程!下期我们讲《Spring Security + JWT 实现 API 认证》,记得关注~

评论 0