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

AI极客
2025-06-15 15:41
阅读 762

开篇:什么是Spring Security?

开篇:什么是Spring Security?

你有没有想过,为什么我们登录网站的时候,有些页面你能访问,有些页面你必须先登录?比如,你没登录就去访问“个人中心”,网站会提示你先登录。

这个背后的安全控制,其实就是由像 Spring Security 这样的框架来实现的。

👉 Spring Security 是什么?

它是一个为 Java Web 应用程序提供安全保护的框架。简单来说,它可以帮你实现:

  • 用户登录验证(用户是否是合法用户)
  • 权限管理(不同用户能做什么)
  • 防止非法请求、伪造攻击等常见安全问题

🎯 本教程的目标: 我们将一起使用 Spring Boot 搭建一个最简单的 Spring Security 安全认证系统。即使你是编程新手,也能一步步跟着操作完成!


环境准备:开始之前你需要的东西

环境准备:开始之前你需要的东西

在开始写代码之前,我们需要准备好开发环境。别担心,步骤不复杂,跟着做就行。

✅ 所需软件:

  1. JDK 8 或以上版本
    Java 开发工具包,是运行 Java 程序的前提。

  2. IntelliJ IDEA(社区版即可)或 Eclipse
    Java IDE(集成开发环境),推荐使用 IntelliJ IDEA。

  3. Maven
    构建工具,用来自动下载依赖库。

  4. Postman 或 浏览器开发者工具(用于测试API)


🔧 步骤一:安装 JDK

如果你还不知道怎么安装 JDK,请搜索 “Java JDK 安装教程 + 你的操作系统” 就可以找到对应的指南。

✅ 检查是否安装成功:

java -version

🔧 步骤二:下载并安装 IntelliJ IDEA

前往官网:https://www.jetbrains.com/idea/

选择 Community 版本进行下载,然后按照提示安装即可。


📦 步骤三:创建一个新的 Spring Boot 项目

我们可以使用 Spring Initializr 快速生成项目骨架。

填写如下信息:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 推荐 2.7.x(稳定版本)
  • Group: com.example
  • Artifact: securitydemo
  • Name: securitydemo
  • Packaging: Jar
  • Java: 8 或以上

然后点击底部【ADD DEPENDENCIES】按钮,添加以下依赖:

  • Spring Web(Web 开发)
  • Spring Security(安全框架)

✅ 点击 Generate Project 下载 ZIP 文件,解压后用 IntelliJ IDEA 打开。


💻 项目结构说明(简单介绍)

打开项目之后,你会看到有一个主类 SecuritydemoApplication.java,看起来像这样:

@SpringBootApplication
public class SecuritydemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SecuritydemoApplication.class, args);
    }
}

接下来我们就可以开始配置安全认证啦!


核心概念:了解几个关键概念,让理解更轻松

核心概念:了解几个关键概念,让理解更轻松

学习 Spring Security 并不需要一开始就记住一堆专业术语。我们先从几个最关键的概念讲起:


🔑 1. 认证 Authentication

认证就是确认用户的“身份”。比如你登录 QQ 的时候,输入账号密码,系统验证你的身份是否正确。

📌 类似于:“你是谁?” 的过程。


🛡️ 2. 授权 Authorization

授权是确定某个用户“能不能做某件事”。比如管理员可以删除文章,普通用户不行。

📌 类似于:“你能做什么?” 的过程。


👤 3. 用户 User

指的是应用程序中的一个个使用者。你可以把他们保存到数据库、文件,甚至内存中。


🧱 4. SecurityFilterChain

这是一个过滤链,相当于“门卫团队”,每当你访问一个页面时,都会经过这一系列的检查(比如是否登录、是否有权限)。


🔐 5. SecurityConfig

这是 Spring Security 的配置类,用来设置如何检查用户身份、哪些页面需要权限、使用哪种登录方式等。


这些概念听不懂也没关系,我们下面通过实际例子来理解它们是怎么工作的!


实战项目:动手搭建一个最简单的安全认证系统

实战项目:动手搭建一个最简单的安全认证系统

我们要做的功能非常简单:所有页面都需要登录才能访问,默认用户名是 user,密码由系统自动生成。


第一步:编写安全配置类

新建一个配置类 SecurityConfig.java

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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;


![系统架构设计图-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025061515/71e697ee-47b2-494f-b61e-f31b8327f496.jpg)


@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((requests) -> requests
                .anyRequest().authenticated() // 所有请求都必须登录才能访问
            )
            .formLogin(); // 使用默认的登录表单

        return http.build();
    }

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

        return new InMemoryUserDetailsManager(user);
    }
}

📌 解释:

  • .anyRequest().authenticated() 表示所有请求都要登录才允许访问。
  • formLogin() 启用了默认的登录界面。
  • 我们定义了一个用户名是 user,密码是 123456 的用户。

第二步:编写一个简单的控制器

新建一个类 HomeController.java,展示一个简单的欢迎页面:

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

@RestController
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "欢迎来到安全世界!";
    }
}

现在启动应用,访问 http://localhost:8080,你会发现跳转到了登录页面:


第三步:尝试登录看看效果

输入用户名:user,密码:123456,回车。

你应该能看到页面上显示一句话:

欢迎来到安全世界!

🎉 成功了!你现在拥有了一个带有登录验证的小型安全系统!


第四步:增加一个管理员角色并限制访问路径

我们再加一个管理员账户,并且只允许管理员访问 /admin 路径。

修改 SecurityConfig.java 中的 userDetailsManager() 方法:

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

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

    return new InMemoryUserDetailsManager(user, admin);
}

然后在 HomeController.java 中添加一个管理员接口:

@GetMapping("/admin")
public String admin() {
    return "管理员专属页面!";
}

再修改一下安全配置,让 /admin 只允许 ADMIN 角色访问:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests((requests) -> requests
            .requestMatchers("/", "/login").permitAll() // 允许匿名访问
            .requestMatchers("/admin").hasRole("ADMIN") // /admin 需要 ADMIN 角色
            .anyRequest().authenticated()
        )
        .formLogin(); // 启用默认登录表单

    return http.build();
}

重启项目后,分别使用 user 和 admin 登录,试试访问 /admin 页面。

  • user 登录 → 提示没有权限
  • admin 登录 → 成功访问

🎯 到这里为止,你已经学会了:

  • 如何启用登录验证
  • 如何添加用户和角色
  • 如何根据路径进行权限控制

常见问题解答

❓1. 登录总是失败怎么办?

  • 检查用户名和密码是否正确(注意大小写)
  • 确保 InMemoryUserDetailsManager 中设置了正确用户
  • 如果用的是加密密码,确保使用了匹配的加密方式(例如 Bcrypt)

❓2. 控制台输出中有乱码或者异常怎么办?

有可能是日志太多干扰了判断,也可以检查:

  • 是否引入了冲突的依赖
  • 是否重复定义了多个 SecurityConfig
  • 是否遗漏了一些必要的注解

❓3. 不想使用默认登录页怎么办?

可以在 SecurityConfig 中配置自定义登录页路径和登录处理逻辑(后续可以深入学习)。


❓4. 怎么退出登录?

访问 /logout 即可退出,Spring Security 自带此功能。


❓5. 用户信息从数据库获取怎么做?

后面我们会学习将用户信息存入 MySQL 数据库,使用 JPA + UserDetails 接口。


学习建议:下一步该学什么?

恭喜你完成了第一个 Spring Security 应用!接下来你还可以继续探索:

📘 阶段一:进阶知识

  • 使用数据库存储用户信息(MySQL + JPA)
  • 使用 JWT 实现无状态安全机制(适合前后端分离项目)
  • 使用 OAuth2 接入微信/QQ/GitHub 登录
  • 配置 HTTPS 安全连接

🧠 阶段二:综合实战项目

  • 搭建博客系统:注册、登录、发表文章、权限管理
  • 开发电商后台:订单管理、角色分级、敏感操作审计
  • API 接口安全防护:防止重放攻击、限制接口频率等

结语:坚持才是进步的关键!

刚开始学 Spring Security 会觉得有点抽象,但只要多敲代码、多练项目,很快就能掌握它的核心用法。

📌 最重要的一句话送给新手朋友们:

不要怕犯错,也不要急着看懂全部原理;先把功能跑起来再说。

随着经验积累,你会发现 Spring Security 越用越顺手!


📚 附录:完整代码 GitHub 地址(虚拟链接供参考):

https://github.com/example/spring-security-demo

如你所愿,本文约 3030 字,内容通俗易懂,适合初学者入门 Spring Security!如果你觉得有用,不妨分享给其他正在努力学习的小伙伴吧 😄

评论 0

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