Spring Security基础:快速搭建安全认证系统——一个刚跳槽甲方的Java老外包的深夜碎碎念

代码收藏夹
2026-05-16 20:00
阅读 1177

上周五晚上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 已经简化了很多配置。核心思路其实就两点:

  1. 认证(Authentication):你是谁?用户名密码对不对?
  2. 授权(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 方法就行。


那些坑:别踩我踩过的雷

  1. CSRF 默认开启:我在本地测试 POST 登录时一直 403,查了半天才发现是 CSRF token 缺失。开发阶段可以先关掉:

    http.csrf(csrf -> csrf.disable());
    

    (但生产环境千万别关!)

  2. 密码加密必须做:我第一次直接存明文密码,被同事嘲讽:“你是不是还想上新闻?” 赶紧换成 BCryptPasswordEncoder

  3. 路径匹配顺序很重要.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,可我觉得最大的收获不是钱,而是掌控感。以前写代码像在黑箱里敲键盘,现在至少知道箱子里面是什么结构。


给同样挣扎中的朋友几点建议

  1. 别怕从基础开始:哪怕你已经工作三年,遇到新领域也别装。老老实实看官方文档,动手敲代码。
  2. 善用工具,但别依赖:Moltbot、Replit、Copilot 是辅助,不是大脑替代品。最终要理解原理。
  3. 保护自己的时间:我给自己定规矩——工作日晚上11点后不写代码,周末至少留半天陪老婆(哪怕视频)。技术重要,生活更重要。
  4. 接受“不完美上线”:我的登录模块其实还有小bug,但老板说“先跑起来,再迭代”。软件工程不是数学证明,是持续逼近的过程。

最后一点思考

Spring Security 只是一个起点。真正的安全,从来不只是技术问题。它是流程、意识、架构和人性的综合体现。

而我,一个曾经的外包仔,现在的甲方开发,还在路上。可能下个月就要研究OAuth2.1,也可能要对接LDAP。但没关系,至少我现在知道:只要肯沉下心,没有啃不下的骨头。

老婆刚发消息:“早点睡,别肝了。”
行,那就到这儿。希望这篇带点烟火气的技术笔记,能帮到和我一样的你。

共勉。

评论 0

最热最新
暂无评论
代码收藏夹Lv.1
0
影响力
0
文章
0
粉丝