零基础也能搞懂!Spring Security快速上手实战

雪崩预防员
2026-01-13 15:08
阅读 1641

大家好,我是小陈,一个在大厂干了3年后端开发的普通程序员,业余时间在B站做技术UP主。最近收到不少粉丝私信问:“我想学Spring Security,但完全不知道从哪开始!”这让我想起了自己刚入行时的窘迫——面对一堆AuthenticationAuthorization术语,简直像看天书。

今天这篇教程,就是为零基础小白量身打造的。我会用最直白的语言、最简单的项目,带你快速搭建一个带登录认证的安全系统。别担心看不懂,我当初也是这么一步步过来的!

小提示:虽然本文讲的是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 会自动生成

创建项目(超简单!)

  1. 打开 https://start.spring.io
  2. 填写:
    • Project: Maven
    • Language: Java
    • Spring Boot: 3.x(最新稳定版)
    • Group/Artifact 随便填,比如 com.example.securitydemo
  3. 关键一步:在 "Dependencies" 搜索框里输入:
    • Spring Web
    • Spring Security
  4. 点击 "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(模板引擎):

  1. pom.xml 加依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  1. 创建 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>
  1. 修改控制器,返回页面:
@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 AuthFlask-Login
  • 核心都是:认证 + 授权 + 会话管理

你之前用 Python 写过运营脚本?那理解“权限控制”应该毫无压力!


六、下一步学习建议

你现在已经掌握了 Spring Security 的基础!接下来可以:

  1. 深入学习

    • JWT 无状态认证(适合前后端分离)
    • OAuth2 接入微信/Google 登录
    • 方法级权限控制(@PreAuthorize
  2. 避坑指南

    • 不要硬编码用户信息(用数据库)
    • 生产环境务必开启 HTTPS
    • 密码策略:至少8位,含大小写+数字
  3. 扩展思考

    • 如果你的系统是给运营团队用的,可能需要更细的权限(比如“只能导出数据,不能删除”)
    • 微服务架构下,如何统一认证?(答案:网关 + Token)

最后送大家一句话:安全不是功能,而是底线。哪怕你的系统再小,也请加上基本认证。毕竟,没人希望自己的“Hello World”被黑客删库跑路 😅

如果你觉得这篇教程有帮助,欢迎去B站搜“程序员小陈”,我会持续更新更多零基础实战教程!下期我们讲《Spring Security + JWT 实现 API 认证》,记得关注~

评论 0

最热最新
暂无评论
雪崩预防员Lv.1
0
影响力
0
文章
0
粉丝