请写一篇关于【Spring Security基础:快速搭建安全认证系统】的技术文章

半个架构师
2025-12-23 01:27
阅读 621

上周五晚上11点半,终于把两个小祖宗哄睡了。老大刚上幼儿园,老二才一岁半,每天晚上都像打了一场硬仗。我轻手轻脚地关上儿童房的门,回到自己租的35平小单间,打开电脑——这大概是我一天中唯一属于自己的时间。

老婆在杭州工作,我在成都,异地已经8个月了。房租3500,工资15k,说实话,压力不小。但我知道,技术不能停。上周公司有个新项目要用Spring Security做权限控制,我虽然用过Shiro,但Security一直没系统学过。于是咬咬牙,决定这个周末“卷”起来。

老婆的一句话点醒了我

其实前天晚上视频的时候,我还跟老婆抱怨:“Spring Security太复杂了,又是Filter Chain,又是UserDetailsService,配置项多得要死,文档还写得云里雾里。”
她笑着说:“你不是总说‘复杂的东西拆开看就不难’吗?先搭个最简单的能跑起来再说啊。”

对啊!我怎么钻牛角尖了?

程序员最容易犯的错误,就是一上来就想搞“完美架构”,结果连Hello World都没跑通就放弃了。就像我当年学Go语言,一开始就想写高性能微服务,结果连goroutine都搞不明白,差点放弃。后来发现,先跑起来,再优化,才是成年人的学习之道。

从0到1:10分钟搭个能用的安全系统

说干就干。周六早上7点,娃还没醒,我泡了杯速溶咖啡(别笑,奶爸哪有时间手冲),新建了一个Spring Boot项目。

第一步:加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

就这么一行!Spring Boot的starter机制真的香。以前手动配XML的日子,再也不想回去了。

第二步:写个Controller试试

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Secure World!";
    }
}

启动!访问http://localhost:8080/hello,跳转到了登录页!控制台还打印了一行自动生成的密码:

Using generated security password: a1b2c3d4-xxxx-xxxx-xxxx-xxxxxxxxxxxx

用户名是user。输入后,成功看到"Hello, Secure World!"。

那一刻我居然有点小激动——原来Spring Security默认就给你一套完整的认证流程!不用写一行配置代码!

第三步:自定义用户(告别随机密码)

当然,生产环境肯定不能用随机密码。我建了个简单的SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.builder()
            .username("dad")
            .password("{noop}123456") // {noop}表示不加密,仅测试用!
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

重启,用dad/123456登录,搞定!

注意:实际项目一定要用PasswordEncoder加密密码!我第一次上线就忘了这点,被同事吐槽:“你这是把用户密码明文存数据库啊?不怕被打吗?”

为什么我要同时提Go?

说到Go,其实是对比学习。去年十月,公司技术栈开始往Go迁移,我也跟着学。Go的net/http包自带简单路由,配合中间件也能做认证,但生态和抽象程度远不如Spring Security成熟

比如在Go里实现RBAC(基于角色的访问控制),你可能要自己写中间件、解析JWT、查数据库……而Spring Security几行注解就能搞定:

@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String adminOnly() {
    return "Only for admins!";
}

当然,Go的优势在于性能和部署简单。但对我这种既要带娃又要学新技术的奶爸来说,Spring Boot + Spring Security 的“约定优于配置”真的省心太多——少写代码,就意味着能早点陪孩子睡觉。

那个崩溃的深夜

其实过程没那么顺利。周三晚上,我试着集成JWT做无状态认证,结果各种403 Forbidden。娃半夜发烧,我一边量体温一边改代码,凌晨三点还在Stack Overflow上翻帖子。

当时真的很焦虑。想着:“是不是年纪大了学不动了?别人30岁当架构师,我还在配SecurityFilterChain……”

但第二天早上,送老大去幼儿园的路上,他突然问我:“爸爸,你昨晚在电脑上敲什么呀?”
我说:“在学一个保护网站不被坏人进来的魔法。”
他眼睛一亮:“那你会魔法吗?”

那一刻,我忽然觉得——我不是在学技术,是在给孩子做榜样。让他知道,遇到困难可以哭,但不能停。

给同样处境朋友的建议

如果你也像我一样:

  • 时间碎片化(哄睡后才有1-2小时)
  • 基础一般(我非科班,大专学历)
  • 压力山大(异地+养娃+房贷)

我的经验是:

  1. 先跑通最小闭环:别一上来就看源码、读论文。先让代码跑起来,建立正反馈。
  2. 善用Spring Boot自动配置:它已经帮你做了80%的工作,你只需要关注20%的定制。
  3. 别怕“抄”:官方Sample、GitHub高星项目,大胆参考。我现在的SecurityConfig就是从Spring Security官方示例改的。
  4. 接受不完美:第一次写的代码肯定烂,但总比不写强。我第一版连密码都没加密,但至少让我理解了流程。

写在最后:技术是手段,生活才是目的

现在,我的Spring Security模块已经上线两周,零故障。上周和HR聊了涨薪的事,从15k提到22k。虽然不多,但够给老婆买张周末飞成都的机票了。

技术永远在变,今天学Security,明天可能要学OAuth2.0、Spring Authorization Server。但不变的是——我们学习的目的,是为了更好地生活,而不是被技术奴役

所以,如果你也在深夜独自敲代码,请记住:

你不是一个孤独的程序员,而是一个为家人奋斗的普通人。
每一行代码,都是通往团聚的阶梯。

下周六,老婆要来成都。我已经订好了她最爱吃的火锅,老大也画了一幅“全家福”要送给她。至于Spring Security?等他们睡了,我再继续优化吧。

毕竟,最好的架构,是既能保护系统安全,也能守护家庭温暖的那个


P.S. 如果你也在异地带娃,请留言交流!一个人扛很累,但一群人走,路就宽了。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝