我一个文科生,是怎么用 Spring Security 搞定登录认证的?

南城开发者
2026-01-05 22:49
阅读 691

大家好!我是个从历史系转行做后端开发的“野生程序员”。当初学 Java 的时候,看到 Spring Security 这个词就头大——名字听起来像军用软件,文档里全是 AuthenticationAuthorizationFilterChain 这种英文术语,连配置文件都长得像天书。

但后来我发现:它其实没那么可怕。今天我就用最接地气的方式,带你从零搭建一个带登录认证的 Web 项目。哪怕你连 “后端” 是啥都不太清楚,也能跟着一步步跑起来!

📌 温馨提示:虽然标题提到了 Python 和区块链,但本文主角是 Java + Spring Boot + Spring Security。为什么?因为安全认证系统在企业级 Java 项目中极为常见,而 Python 虽然也能做(比如用 Flask-Login),但 Spring Security 是行业标准之一。至于区块链?别担心,文末我会解释它们的关系,放心往下看!


第一步:先搞清楚——Spring Security 到底是干啥的?

想象你开了一家咖啡馆:

  • 没装门禁:谁都能进,随便拿咖啡喝 → 这就是没有安全控制的网站。
  • 装了门禁+会员卡:只有注册会员才能进,VIP 还能进包间 → 这就是 Spring Security 干的事!

简单说:Spring Security 就是给你的 Web 应用加“门禁系统”的工具。它能:

  • 让用户登录(Authentication)
  • 控制谁能访问哪些页面(Authorization)
  • 防止黑客攻击(比如 CSRF、暴力破解)

我当初学的时候,以为它只能做“账号密码登录”,后来才知道它还能对接微信、GitHub、甚至区块链钱包地址认证(后面会提)!


环境准备:5 分钟搭好开发环境

我们用 Spring Boot(Spring 的简化版)来快速启动项目。你需要:

工具 版本建议 作用
JDK 17 或 21 Java 运行环境
Maven / Gradle 最新版 项目依赖管理
IDE IntelliJ IDEA(社区版免费) 写代码的编辑器

步骤 1:创建项目

打开 https://start.spring.io,按如下配置:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.x
  • Dependencies: 勾选 Spring Web + Spring Security

点击 “Generate” 下载 ZIP,解压后用 IDEA 打开。

💡 小贴士:如果你习惯用 Python,可能会觉得这很繁琐。但 Java 生态就是这样——前期配置多,后期稳如老狗。

步骤 2:验证项目能跑

打开 DemoApplication.java,点击运行。看到控制台输出:

Tomcat started on port(s): 8080

说明成功!现在访问 http://localhost:8080,你会被自动跳转到一个 默认登录页

用户名是 user,密码在控制台里(每次启动都会变,比如 Using generated security password: a1b2c3d4...)。

恭喜!你已经拥有了一个带安全认证的 Web 应用——虽然啥功能都没有 😅


核心概念:用“咖啡馆”模型理解安全机制

1. Authentication(认证) = 验证你是谁

就像出示会员卡。Spring Security 会问:“你叫什么?密码多少?”
对应代码中的 UserDetailsService

2. Authorization(授权) = 验证你能干啥

普通会员只能坐大厅,VIP 能进包间。
对应代码中的 hasRole('VIP')permitAll()

3. Security Filter Chain(过滤器链) = 门禁检查流程

每个请求进来,都要经过一串“安检门”:

请求 → 检查是否登录 → 检查是否有权限 → 放行 or 拦截

Spring Security 自动帮你装好了这些“安检门”。


实战项目:做一个“私人笔记”网站

我们要做一个只有登录用户才能看的笔记列表页。目标:

  • 访问 /notes 必须登录
  • 首页 / 允许游客访问
  • 用内存中的账号密码登录(先别管数据库)

步骤 1:写个简单的 Controller

// src/main/java/com/example/demo/NoteController.java
@RestController
public class NoteController {

    @GetMapping("/")
    public String home() {
        return "欢迎来到我的笔记!<a href='/notes'>查看笔记</a>";
    }

    @GetMapping("/notes")
    public String notes() {
        return "这是你的私人笔记:\n- 今天学会了 Spring Security!";
    }
}

步骤 2:自定义安全规则

新建一个配置类:

// src/main/java/com/example/demo/SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/").permitAll()      // 首页公开
                .anyRequest().authenticated()          // 其他都要登录
            )
            .formLogin(form -> form
                .loginPage("/login")                   // 使用默认登录页
                .permitAll()
            )
            .logout(logout -> logout.permitAll());

        return http.build();
    }

    // 内存中存两个测试账号
    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("alice")
            .password("123456")
            .roles("USER")
            .build();

        return new InMemoryUserDetailsManager(user);
    }
}

步骤 3:启动并测试

  1. 运行项目
  2. 访问 http://localhost:8080 → 能直接看到首页
  3. 点击链接进入 /notes → 自动跳转到登录页
  4. 输入用户名 alice,密码 123456 → 成功看到笔记!

✅ 完成!你刚刚亲手搭建了一个带权限控制的 Web 应用。


新手常见问题 & 避坑指南

❓ 问题 1:为什么我访问任何页面都被强制登录?

原因:你没配置 permitAll()。Spring Security 默认 所有请求都要认证

解决:在 authorizeHttpRequests 里明确放行不需要登录的路径,比如:

.requestMatchers("/", "/public/**", "/css/**").permitAll()

❓ 问题 2:密码明文写在代码里不安全!

对! 上面只是演示。真实项目要用:

  • 数据库存储加密后的密码(用 BCryptPasswordEncoder
  • 或集成 OAuth2(微信/Google 登录)

❓ 问题 3:和 Python 的 Flask-Security 有啥区别?

特性 Spring Security (Java) Flask-Security (Python)
学习曲线 陡峭(配置多) 平缓(代码少)
企业应用 极其广泛 中小型项目
扩展性 插件丰富(支持 SAML、LDAP 等) 相对简单

我当初用 Python 写过小项目,但入职后公司全用 Spring,所以不得不啃下来。技术选型看场景,不是越简单越好

❓ 问题 4:这和区块链有关系吗?

有!但不是直接相关

  • 区块链项目也需要用户认证。比如一个去中心化笔记应用(用 IPFS 存数据 + 区块链存哈希),前端可能用 Web3.js 获取钱包地址,后端用 Spring Security 验证该地址是否有权限读取某条笔记。
  • 你可以把区块链地址当作“用户名”,签名当作“密码”,集成到 Spring Security 的 AuthenticationProvider 中。

我参与过一个 NFT 项目,就是用 Spring Security + MetaMask 钱包登录的。技术栈混搭才是常态!


下一步怎么学?给零基础朋友的建议

✅ 短期目标(1周内)

  1. 把上面的代码自己敲一遍,改改路径、加个 /admin 页面(只允许 ADMIN 角色访问)
  2. 尝试用 @PreAuthorize("hasRole('ADMIN')") 注解控制方法权限
  3. 把内存用户换成数据库(H2 或 MySQL)

🔜 中期路线(1个月内)

  • 学习 JWT(JSON Web Token):用于前后端分离项目的认证
  • 了解 OAuth2:实现“微信一键登录”
  • 探索 Spring Security + Vue/React 前后端联调

🚫 避坑提醒

  • 不要一开始就看源码!先会用,再深究原理。
  • 别死磕 XML 配置:现在都用 Java Config(就是上面的 @Configuration 方式)。
  • 别怕英文文档:Spring 官方指南写得非常清晰,配合翻译插件即可。

最后说两句心里话

作为一个文科生,我深知面对满屏代码时的无力感。但请相信:所有复杂的系统,都是由简单的模块堆起来的

Spring Security 看似庞大,核心就两件事:

  1. (Who)可以访问
  2. 什么(What)可以被访问

只要你抓住这个主线,慢慢扩展,很快就能驾驭它。我当年也是从“连 Maven 是啥都不知道”走到今天能带团队做金融级安全系统的。

技术没有门槛,只有愿不愿意迈出第一步。

加油!你的第一个安全认证系统,已经跑起来了 🎉

P.S. 如果你想看 Python 版的安全认证教程(比如用 FastAPI + JWT),或者 Spring Security + 区块链钱包登录实战,欢迎留言!我可以接着写~

评论 0

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