Spring Security基础:快速搭建安全认证系统(零基础入门)

预发守门员
2025-06-15 22:54
阅读 202

开篇:Spring Security 是什么?我们为什么需要它?

开篇:Spring Security 是什么?我们为什么需要它?

你有没有想过,当你登录一个网站、购物平台或社交App的时候,后台是如何确认你是“真正的你”的呢?这就是身份验证和权限控制在起作用。

Spring Security 就是一个专门帮我们解决这些问题的框架。它是基于 Java 的,适用于使用 Spring 框架开发的应用程序(特别是后端接口)。

通俗点说,它就像一道门卫系统:

  • 用户来访问资源时,它会先问:“你是谁?”(认证)
  • 然后再看用户是不是有进入某个房间的权限(授权)

在这篇文章里,我会手把手带你们从零开始,用 Spring Security 快速搭建一个简单的安全认证系统,即使是编程小白也能理解并操作。


第一步:环境准备

第一步:环境准备

1. 安装必要的软件

为了完成这个项目,你需要安装以下工具:

工具名称 下载地址 版本建议
JDK OracleOpenJDK 17
IntelliJ IDEA JetBrains官网 社区版即可
Maven 如果你用的是IDEA,一般已内置 3.x以上
Postman(API调试工具) Postman官网 最新版本

2. 创建Spring Boot项目

我们可以使用 Spring Initializr 来快速生成项目结构:

  1. 打开网址,选择如下配置:

    • Project: Maven
    • Language: Java
    • Spring Boot Version: 推荐 3.x(如 3.1)
    • Dependencies: 勾选 Spring WebSpring Security
  2. 点击 “Generate” 下载项目压缩包,解压后导入到 IntelliJ IDEA 中。


核心概念讲解(用小白语言解释)

核心概念讲解(用小白语言解释)

Spring Security 虽然强大,但对我们来说有些概念很陌生。别担心,下面我会把它们简化成生活中的例子。

1. 认证(Authentication)

想象你在机场过安检时出示身份证,工作人员检查你的身份。

在Spring Security中,认证就是系统核对你是谁的过程。

比如:

  • 输入用户名和密码
  • 使用短信验证码
  • 指纹识别等

2. 授权(Authorization)

还是那个机场的例子,出示身份证通过了安检后,你还得看看你能不能上飞机——只有持有机票的人才能登机。

授权就是判断你是否有权限访问某个资源或功能。

比如:

  • 是否可以查看用户信息?
  • 是否可以删除文章?

3. 过滤器(Filter)

你可以把它想成一个流水线上的“检测站”。每一个请求都要经过这些“安检口”,例如:

  • 防止跨域攻击(CSRF)
  • 验证 Token 合法性
  • 处理登录请求

4. SecurityConfig 类

这是Spring Security的核心类,用来配置整个安全系统的规则,比如:

  • 哪些路径需要登录?
  • 使用什么样的登录方式?
  • 错误处理怎么做?

实战演练:一步步搭建第一个安全应用

实战演练:一步步搭建第一个安全应用

接下来,我们会创建一个最基础的安全认证系统,包含登录功能和不同权限控制。

步骤1:添加依赖(Maven)

如果你是手动创建项目,请确保 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>

步骤2:编写一个简单接口

我们在 src/main/java/[你的包名]/ 目录下创建一个 Controller:

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "你好,世界!";
    }
}

启动项目后,默认访问 http://localhost:8080/hello 会报错 —— 因为被 Spring Security 保护起来了!

步骤3:配置 SecurityConfig 类

新建一个配置类 SecurityConfig.java

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/hello").authenticated() // 要求登录才能访问
                .anyRequest().permitAll()
            )
            .formLogin(withDefaults()) // 启用默认登录表单
            .logout(withDefaults());  // 默认登出功能

        return http.build();
    }
}

现在再运行项目,访问 /hello 时会跳转到登录页面!

Spring Security 给我们自动提供了登录界面,用户名是 user,密码在日志中自动生成(类似 Using generated security password...),你可以查看控制台获取。

步骤4:设置自己的账号密码

修改 application.properties 添加:

spring.security.user.name=admin
spring.security.user.password=123456

重启服务,现在可以用 admin / 123456 登录了!


拓展功能:加入角色权限控制

我们来添加一些更高级的玩法 —— 角色权限。

修改 SecurityConfig 加入角色控制:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/admin/**").hasRole("ADMIN") // admin开头的接口需 ADMIN 角色
            .requestMatchers("/user/**").hasAnyRole("USER", "ADMIN") // user开头可由 USER或ADMIN访问
            .anyRequest().permitAll()
        )
        .formLogin(withDefaults())
        .logout(withDefaults());

    return http.build();
}

然后我们修改账号信息,在 application.properties 设置两个用户及其角色:

spring.security.user.name=admin
spring.security.user.password=123456
spring.security.user.roles=ADMIN

# 新增另一个用户
spring.security.users[0].name=user1
spring.security.users[0].password=123456
spring.security.users[0].roles=USER

添加两个测试接口:

@GetMapping("/admin/dashboard")
public String adminDashboard() {
    return "欢迎管理员";
}

@GetMapping("/user/profile")
public String userProfile() {
    return "用户资料页";
}

试着用不同账号登录访问 /admin/dashboard/user/profile,看看是否限制正确。


常见问题解答(FAQ)

数据库设计模型-1

Q1: 启动项目时提示找不到 SecurityConfig?

请确保你的 SecurityConfig 类上有 @Configuration 注解,并且位于主应用程序类能扫描到的包内。

Q2: 控制台没有显示随机生成的密码?

这是因为你自己设置了 spring.security.user.name 和 password,Spring就不会生成默认密码了。

Q3: 我用 POSTMAN 请求 /login 返回 403?

可能是缺少 CSRF 防护机制或 Session 缺失导致的。建议使用 Cookie + 表单提交登录方式。或者临时禁用 CSRF:

.csrf(AbstractHttpConfigurer::disable)

⚠️ 注意:生产环境不应禁用 CSRF!

Q4: 我想用数据库验证用户怎么办?

后面章节我们会讲到如何结合数据库做认证,比如通过 JPA 查询用户信息。


学习建议:下一步怎么学?

你现在掌握了 Spring Security 的基本使用,包括:

  • 登录认证
  • URL访问控制
  • 角色权限设定

下一步建议你可以学习以下几个方向:

1. 自定义登录页面(替换默认表单)

学会自己设计美观的登录页面。

2. 数据库存储用户信息

使用 MySQL + Spring Data JPA 做用户持久化管理。

3. JWT 认证(无状态登录)

适合前后端分离项目,使用 Token 替换 Session。

4. OAuth2 & 单点登录(SSO)

了解主流企业的第三方登录机制。


小结

这篇文章我们一起完成了:

✅ 安装开发环境
✅ 创建 Spring Boot 项目
✅ 配置 Spring Security
✅ 实现登录与权限控制
✅ 了解核心概念

记住一句话:Spring Security 并不难,关键在于动手试

如果你觉得有帮助,也可以收藏这篇教程反复回顾。下一章我们将继续深入,教你如何连接数据库做登录验证哦!


👉 下期预告:《Spring Security实战进阶:连接MySQL实现用户登录》

希望你继续关注我的系列教程,一起打怪升级!💪

评论 0

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