Spring Security基础:快速搭建安全认证系统

威武虎
2025-06-17 11:36
阅读 543

开篇:Spring Security是什么,用来做什么?

开篇:Spring Security是什么,用来做什么?

如果你是刚开始接触后端开发的新手,可能会听说过“Spring Security”这个名字。那么它到底是什么呢?简单来说,Spring Security 是一个专门为 Java 应用提供安全保护的框架,它可以帮你实现用户登录、权限管理、数据加密等一系列保障系统安全的功能。

在实际开发中,很多应用都需要验证用户身份(比如登录功能),并根据不同的用户角色来限制访问内容(比如普通用户和管理员能看到的内容不同)。这时,Spring Security 就派上用场了。你可以把它想象成你家的门禁系统——它负责识别谁可以进门(认证),以及进门之后能去哪些房间(授权)。

本教程将从零开始,带你一步步搭建一个使用 Spring Security 实现基本安全认证功能的 Spring Boot 项目。即使你没有接触过这个框架,也不用担心,我们从最基础的知识讲起,确保你能轻松入门!


环境准备:搭建开发环境

环境准备:搭建开发环境

要开始学习 Spring Security,首先我们需要准备好开发环境。以下是一些必要的工具:

所需工具列表:

  1. Java 开发环境(JDK)
  2. IDE(推荐 IntelliJ IDEA 或 Eclipse)
  3. Maven(用于依赖管理)
  4. Postman 或浏览器(用于测试接口)

安装步骤:

步骤 1:安装 JDK

  • 推荐使用 OpenJDK 17 或更高版本。
  • 可以通过 Adoptium 下载适合你操作系统的 JDK 包。
  • 安装完成后,在命令行输入 java -version 验证是否安装成功。

步骤 2:安装 IDE

  • 如果你是新手,建议使用 IntelliJ IDEA 社区版,下载地址:JetBrains官网
  • 安装完成后打开软件,稍后我们会创建一个新的 Spring Boot 项目。

步骤 3:配置 Maven

  • 大多数 IDE 已经自带 Maven 支持。
  • 在项目中我们会使用 Maven 来引入 Spring Security 的相关依赖。

步骤 4:准备测试工具

  • 可选地安装 Postman 或直接使用浏览器测试 GET 请求。

核心概念:认识 Spring Security 的关键术语

核心概念:认识 Spring Security 的关键术语

为了更好地理解后面的操作,我们先介绍几个 Spring Security 中最重要的概念:

1. 认证(Authentication)

认证就是确认“你是谁”。比如你在网站上输入用户名和密码登录的过程,就是在进行认证。

2. 授权(Authorization)

授权是确认“你能干什么”。例如,一个普通用户只能查看信息,而管理员可以添加或删除内容。

3. 用户详情服务(UserDetailsService)

这是一个接口,Spring Security 会通过这个接口获取用户的详细信息(如用户名、密码、权限等)。

4. 安全配置类(SecurityConfig)

这是我们编写配置的地方,告诉 Spring Security 哪些接口需要认证、哪些用户有权限访问等。

5. 内存用户(In-Memory User)

为了让初学者更方便,我们可以直接在代码中定义一个“内存用户”,即不连接数据库,而是把用户信息写死在配置文件或代码里。


实战项目:搭建第一个带安全认证的 Spring Boot 应用

下面我们将一起创建一个 Spring Boot 项目,并使用 Spring Security 实现基本的登录认证功能。

第一步:创建 Spring Boot 项目

你可以使用 Spring Initializr 快速生成项目结构。

选择如下配置:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 最新稳定版(如 3.0.x)
  • Dependencies:
    • Spring Web(用于创建 Web API)
    • Spring Security(用于安全控制)

点击 Generate 按钮下载项目压缩包。解压后导入到你的 IDE 中。

第二步:添加 Spring Security 依赖(如果未自动添加)

打开 pom.xml 文件,确认是否有以下依赖(正常情况下已自动生成):

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

如果没有,请手动添加。

第三步:创建一个简单的 Controller

新建一个控制器类 HelloController.java

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, welcome to Spring Security world!";
    }
}

运行项目,访问 http://localhost:8080/hello,你会发现被重定向到了一个登录页!

这是 Spring Security 自动开启的安全防护机制。下面我们来配置用户名密码。

第四步:配置内存用户

application.properties 文件中添加:

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

重启项目,再次访问 /hello,输入用户名 admin 和密码 123456,就可以正常看到页面内容了!

第五步:编写自定义安全配置类

虽然前面已经完成了简单的认证,但我们还可以自定义更多规则。比如设置多个用户、允许某些接口无需登录访问等。

创建 SecurityConfig.java 类:

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public InMemoryUserDetailsManager userDetailsManager() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();

        UserDetails admin = User.withDefaultPasswordEncoder()
            .username("admin")
            .password("admin123")
            .roles("ADMIN")
            .build();

        return new InMemoryUserDetailsManager(user, admin);
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((requests) -> requests
                .requestMatchers("/public/**").permitAll()  // 允许匿名访问 /public 路径下的所有接口
                .anyRequest().authenticated()   // 其他请求都必须登录才能访问
            )
            .formLogin();   // 启用默认登录页面

        return http.build();
    }
}

这段代码做了几件事:

  • 创建了两个用户:user(普通用户)、admin(管理员)
  • 设置了 /public/** 路径下无需登录就能访问
  • 其他路径都要求登录
  • 启用了表单登录界面

重启项目后,尝试访问:

  • http://localhost:8080/public/test —— 无需登录即可访问
  • http://localhost:8080/hello —— 输入刚才设置的 user/passwordadmin/admin123 登录

🎉 到此为止,你已经搭建了一个完整的基础安全认证系统!


常见问题解答

❓1. 为什么登录页面变成英文了?

Spring Security 默认使用国际化资源包显示语言,默认是英文。你可以通过添加自定义登录页面来更改语言。我们会在后续进阶课程中讲解如何定制登录页。

❓2. 我设置了用户名密码,但不能登录?

检查你的 application.propertiesSecurityConfig.java 是否正确配置了密码。注意:

  • 密码不要忘记
  • 使用 .withDefaultPasswordEncoder() 时密码明文存储,仅限测试
  • 正式项目应使用 BCrypt 加密(高级内容)

❓3. 如何让某个接口不用登录也能访问?

SecurityFilterChain 中使用 .requestMatchers("/路径") 配合 .permitAll() 即可,例如:

.requestMatchers("/index", "/about").permitAll()

❓4. 我可以自己写登录页面吗?

当然可以!只需要在配置中添加 .loginPage("/your-login-page"),并处理 POST 提交的 /login 请求。


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

恭喜你完成了本次基础教程!现在你已经掌握了:

✅ 创建 Spring Boot 项目
✅ 引入 Spring Security 并配置内存用户
✅ 控制接口访问权限
✅ 自定义安全配置类

接下来,你可以继续深入以下几个方向的学习:

📚 推荐进阶学习路线:

  1. 学习使用数据库保存用户信息(JPA + 数据库)
  2. 实现基于角色的访问控制(Role-Based Access Control)
  3. 使用 JWT 实现无状态认证(前后端分离场景)
  4. 集成 OAuth2、GitHub 登录等功能
  5. 使用 Thymeleaf 编写自定义登录页面

💡 学习建议:

  • 动手实践最重要!每学一个知识点都要自己写代码试试
  • 多查官方文档:Spring Security Docs
  • 不怕报错,遇到问题多看日志,学会 Google 解决方案
  • 可以参考一些开源项目加深理解

总结

本教程从零开始,逐步带领大家完成了一个简单的 Spring Security 安全认证系统。希望你现在对 Spring Security 有了初步了解,并能独立搭建自己的项目。

Spring Security 功能强大且灵活,虽然刚开始有些复杂,但只要不断练习,你一定能够掌握它。如果你喜欢这样的教学方式,欢迎继续关注后续的《Spring Security实战进阶》系列教程!

祝你学习顺利,成为一名优秀的后端开发者!🚀

评论 0

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