Spring Security基础:快速搭建安全认证系统——一个刚跳槽甲方的Java老外包的深夜碎碎念
上周五晚上11点,我坐在公司工位上,盯着IDEA里一堆红叉叉发呆。窗外北京初春的风刮得呼呼响,办公室只剩我一个人,连保洁阿姨都下班了。手机震动了一下,是我老婆发来的消息:“还没回?” 我回了个苦笑表情包,心里盘算着:再熬一小时,把登录模块搞定就走。
这已经是我跳进这家甲方公司的第三个月。去年十月,我终于从干了三年外包的“码农流水线”跳了出来,月薪从15k涨到了22k,还多了五险一金和年假。虽然房租还是3500块,在望京合租的小单间,但至少不用再被客户指着鼻子骂“你们外包就是不行”。
可现实是,甲方的世界也没那么美好。今天要上线的新后台系统,安全模块卡壳了。老板说:“这个登录功能下周必须上线,不然影响整个项目节奏。” 问题来了:我之前在外包公司,都是直接调用现成的SSO(单点登录),哪自己搭过认证系统?Spring Security?听说过,没碰过。
从零开始:Spring Security 到底是个啥?
说实话,我一开始以为Spring Security就是个“加个注解就能自动登录”的玩意儿。结果一查文档,好家伙,概念一大堆:Authentication、Authorization、UserDetailsService、PasswordEncoder、SecurityFilterChain……看得我头大。
那天晚上回家路上,地铁上刷知乎,看到有人说:“Spring Security就像一把瑞士军刀,功能强大但新手容易割到手。” 我深有同感。
于是周末两天,我没去见老婆(她在北京南边,我在北边,来回一趟要三小时),窝在出租屋啃官方文档。还好,现在的Spring Boot 3.x + Spring Security 6.x 已经简化了很多配置。核心思路其实就两点:
- 认证(Authentication):你是谁?用户名密码对不对?
- 授权(Authorization):你能干啥?有没有权限访问某个接口?
下面我就用最简单的方式,带大家快速搭一个能跑起来的系统。
动手实操:五分钟跑通基础认证
首先,建个Spring Boot项目(我用的是Java 17 + Spring Boot 3.2)。pom.xml 加上依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
然后写个最简配置类:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.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(passwordEncoder().encode("123456"))
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
搞定!启动后,访问 /hello 会自动跳转到 /login 页面(Spring Security默认提供的)。输入 user / 123456 就能登录。
当然,这只是玩具级代码。实际项目肯定要用数据库查用户,比如集成 MyBatis 或 JPA。但核心逻辑不变:实现 UserDetailsService,重写 loadUserByUsername 方法就行。
那些坑:别踩我踩过的雷
CSRF 默认开启:我在本地测试 POST 登录时一直 403,查了半天才发现是 CSRF token 缺失。开发阶段可以先关掉:
http.csrf(csrf -> csrf.disable());(但生产环境千万别关!)
密码加密必须做:我第一次直接存明文密码,被同事嘲讽:“你是不是还想上新闻?” 赶紧换成
BCryptPasswordEncoder。路径匹配顺序很重要:
.requestMatchers("/public/**").permitAll()必须写在.anyRequest().authenticated()前面,否则所有请求都被拦了。
意外插曲:Moltbot、Replit Agent 和 Fine-tuning
说到学习过程,其实我还偷偷用了点“外挂”。
上个月,我试了下 Moltbot —— 一个国产的AI编程助手。它能根据注释生成Java代码,对Spring Security这种模板化配置挺有用。比如我写注释:“配置一个允许/public路径匿名访问的安全策略”,它真能吐出接近正确的代码。虽然偶尔会把 HttpSecurity 写成 HttpSecurityConfig 这种低级错误,但至少省了查文档的时间。
后来我又在 Replit 上开了个 workspace,用他们的 Replit Agent 跑了个 Python 脚本,用来批量生成测试用户数据。别笑,虽然我是Java开发,但Python处理数据真的快。几行代码就能生成100个带加密密码的用户JSON:
import bcrypt
import json
users = []
for i in range(100):
pwd = f"pass{i}"
hashed = bcrypt.hashpw(pwd.encode(), bcrypt.gensalt()).decode()
users.append({"username": f"user{i}", "password": hashed})
with open('users.json', 'w') as f:
json.dump(users, f)
至于 Fine-tuning(微调)?那是我老婆的领域。她在一家AI startup 做算法工程师,经常跟我吐槽:“你们Java开发总想用规则解决一切,我们搞模型的知道世界是模糊的。” 有一次我问她能不能帮我微调个模型专门生成Spring Security配置,她白了我一眼:“你不如先把官方文档看完。”
为什么我要死磕Spring Security?
可能有人会说:“现在不是有OAuth2、JWT、Auth0这些现成方案吗?何必自己造轮子?”
道理我都懂。但在甲方,尤其是传统行业,很多系统还是内网部署,不能连外网。老板也不愿意为认证服务额外付费。所以,掌握Spring Security这种“自给自足”的能力,反而成了硬通货。
更重要的是,理解底层机制,才能不被框架绑架。就像我之前在外包公司,只知道调API,一旦出问题就抓瞎。现在至少能看懂Security的过滤器链是怎么一层层跑的。
异地生活与技术成长的微妙平衡
写这篇文章的时候,已经是周日凌晨一点。老婆刚刚打来视频,说:“你又熬夜?明天还要早起开会吧?” 我嗯嗯啊啊应付过去,心里其实有点愧疚。
跳槽甲方后,工作压力反而更大了——不再是“完成任务就行”,而是“你要对结果负责”。但好处是,我能真正深入一个技术栈,而不是像外包那样永远在“需求-交付-下一个需求”的循环里打转。
月薪涨了7k,可我觉得最大的收获不是钱,而是掌控感。以前写代码像在黑箱里敲键盘,现在至少知道箱子里面是什么结构。
给同样挣扎中的朋友几点建议
- 别怕从基础开始:哪怕你已经工作三年,遇到新领域也别装。老老实实看官方文档,动手敲代码。
- 善用工具,但别依赖:Moltbot、Replit、Copilot 是辅助,不是大脑替代品。最终要理解原理。
- 保护自己的时间:我给自己定规矩——工作日晚上11点后不写代码,周末至少留半天陪老婆(哪怕视频)。技术重要,生活更重要。
- 接受“不完美上线”:我的登录模块其实还有小bug,但老板说“先跑起来,再迭代”。软件工程不是数学证明,是持续逼近的过程。
最后一点思考
Spring Security 只是一个起点。真正的安全,从来不只是技术问题。它是流程、意识、架构和人性的综合体现。
而我,一个曾经的外包仔,现在的甲方开发,还在路上。可能下个月就要研究OAuth2.1,也可能要对接LDAP。但没关系,至少我现在知道:只要肯沉下心,没有啃不下的骨头。
老婆刚发消息:“早点睡,别肝了。”
行,那就到这儿。希望这篇带点烟火气的技术笔记,能帮到和我一样的你。
共勉。

评论 0