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

赵雨泽☆
2025-06-15 22:22
阅读 356

一、开篇:什么是Spring Security?它能做什么?

一、开篇:什么是Spring Security?它能做什么?

大家好!如果你是第一次听说 Spring Security,那恭喜你即将进入一个强大的 Java 安全框架的世界。Spring Security 是用于保护基于 Spring 的应用程序的官方安全框架。简单点说,它就是你程序里的“保安”,可以防止未经授权的人访问你的系统。

想象一下:

  • 你在做一个网上商城系统,用户只有登录后才能下单。
  • 你在做公司内部管理系统,不同角色(比如管理员、普通员工)能看到不同的数据。

这些场景都需要我们对“谁有权限访问”进行管理和控制,这就是 安全认证与授权的工作。而 Spring Security 就是专门来帮你解决这些问题的好帮手

在本篇文章中,我们将从零开始,通过一步步实战操作,教你搭建一个具备基本登录验证功能的小项目。即使你是完全的编程小白,也能轻松上手!


二、环境准备:搭建开发环境(Windows/Mac通用)

二、环境准备:搭建开发环境(Windows/Mac通用)

要使用 Spring Security,我们需要先准备好开发工具和运行环境。我们推荐以下组合:

✅ 所需软件清单:

工具 版本要求
Java JDK ≥ 11
IntelliJ IDEA 或 Eclipse 推荐用 IDEA 社区版
Maven 自动集成(IDE内置)
Spring Boot 2.x 或 3.x(教程兼容)

步骤 1:安装 Java JDK

你可以去官网下载并安装 Java 开发工具包(JDK)。建议选择 Oracle JDK 或开源版本 OpenJDK

安装完成后,在命令行执行下面命令检查是否成功:

java -version
javac -version

输出结果类似于:

openjdk version "17.0.7" 2023-04-18

说明安装成功。

步骤 2:安装开发工具(IDE)

推荐新手使用 IntelliJ IDEA Community Edition,它是免费的,并且对 Spring 支持非常好。

👉 下载地址:https://www.jetbrains.com/idea/download/

安装后打开,就可以开始我们的项目啦!


三、核心概念:通俗易懂讲明白关键术语

三、核心概念:通俗易懂讲明白关键术语

Spring Security 虽然强大,但也有一些常见的术语需要理解。我们用生活中的例子类比讲解:

🔐 用户认证(Authentication)

就像进小区门禁刷脸或刷卡的动作 —— 验证你是不是你。

在 Spring Security 中,最简单的做法是让用户输入用户名和密码,然后判断是不是合法用户。

🧾 用户授权(Authorization)

确认了你是谁之后,还要判断你能干什么。比如:

  • 普通用户只能看商品
  • 管理员还能编辑和删除

Spring Security 可以根据用户的角色(Role)来限制其能访问哪些网页接口。

👤 用户、角色、权限模型

这个模型类似一个企业的组织结构:

  • 用户 = 员工
  • 角色 = 岗位(如:程序员、产品经理)
  • 权限 = 具体能做的事(如:查看订单、修改库存)

💼 过滤器(Filter)

Spring Security 使用多个过滤器来处理请求。每个请求进来之前都要过几关检查,比如有没有登录、有没有权限等。


四、实战项目:跟着一起做 —— 创建一个安全的 Web 应用

四、实战项目:跟着一起做 —— 创建一个安全的 Web 应用

我们现在就要创建一个 Spring Boot Web 项目,并加入 Spring Security 实现登录验证功能。

步骤1:创建项目

使用 Spring Initializr 快速生成项目骨架:

👉 访问:https://start.spring.io

填写如下信息:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 最新稳定版本(如 3.1.x)
  • Group: com.example
  • Artifact: securitydemo
  • Packaging: Jar
  • Dependencies:
    • Spring Web(用于构建Web应用)
    • Spring Security(安全模块)

点击【Generate】按钮下载 ZIP 文件,解压后用 IntelliJ IDEA 打开即可。

步骤2:添加首页控制器

我们先写一个简单页面 /hello,测试网站是否正常工作。

新建文件 src/main/java/com/example/securitydemo/controller/HomeController.java

package com.example.securitydemo.controller;

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

@RestController
public class HomeController {
    @GetMapping("/hello")
    public String sayHello() {
        return "你好,欢迎来到 Spring Security 教程!";
    }
}

运行项目后访问 http://localhost:8080/hello,你应该会看到:

你好,欢迎来到 Spring Security 教程!

🎉 恭喜你完成第一步!

步骤3:启用 Spring Security 保护

现在,我们要给这个项目加上登录验证功能。

第一步:引入配置类

创建一个新的 Java 类文件: src/main/java/com/example/securitydemo/config/SecurityConfig.java

内容如下:

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

@Configuration
public class SecurityConfig {

    // 添加两个内存中的用户(测试用途)
    @Bean
    public InMemoryUserDetailsManager userDetailsManager() {
        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 InMemoryUserDetailsManager(user, admin);
    }

    // 定义安全策略
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/hello").authenticated()
                .anyRequest().permitAll())
            .formLogin(login -> login
                .loginPage("/login")
                .permitAll())
            .logout(logout -> logout
                .permitAll());

        return http.build();
    }
}

上面代码做了两件事:

  1. 配置了两个测试用户(用户名分别是 user 和 admin)
  2. /hello 页面加上了访问验证

第二步:添加登录页面

虽然我们可以直接使用 Spring 提供的默认登录页面,但为了更直观,我们手动创建一个。

创建目录结构:

src/main/resources/templates/

并在这个目录下创建一个叫 login.html 的文件,内容如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
    <h3>请登录</h3>
    <form method="post" action="/login">
        用户名:<input type="text" name="username"><br><br>
        密码:<input type="password" name="password"><br><br>
        <button type="submit">登录</button>
    </form>
</body>
</html>

这样,当我们访问 /hello 页面时,就会跳转到 /login 页面,让用户登录。

第三步:重启服务,测试效果

重新启动应用,再次访问 http://localhost:8080/hello,你会被自动重定向到 /login 页面:

✅ 用刚才定义的账号试试登录:

  • 用户名:user / 密码:123456
  • 或者:admin / admin123

如果登录成功,就能看到 Hello 页面的内容啦!


五、常见问题解答(FAQ)

很多小伙伴在学习过程中会遇到一些疑问,下面是几个新手最容易踩坑的问题,快来看有没有你关心的👇

❓1. 我输入正确的用户名和密码为什么还无法登录?

可能原因:

  • 输入错误(注意大小写)
  • 密码加密方式没处理正确(这里我们使用 {noop} 表示不加密,后面学多了再换成加密存储)
  • 控制台是否有报错日志?比如 Bad credentials 错误

🔍 解决方法:

  • 查看控制台输出,确认是否有认证失败提示
  • 再次核对用户名和密码是否正确

❓2. 为什么我看不到自定义的登录页面?

检查点:

  • 是否将模板放在了 src/main/resources/templates/ 目录下?
  • 登录页面的名字是否叫 login.html
  • 是否在 Security 配置中设置了 .loginPage("/login")

❓3. 启动时报错 Could not initialize class javax.crypto.KeyGeneratorSpi?

这类错误多出现在 macOS 或 Linux 上,因为部分 JRE 缺少某些加密组件。

✅ 解决方案:

  • 使用 OpenJDK 安装包而不是精简版
  • 确保你的 JDK 是完整版(可以通过 SDKMAN! 或 Homebrew 安装)

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

恭喜你完成了本次入门教程!接下来你可以沿着以下路径继续深入学习:

🔹 进阶方向1:数据库存储用户信息

目前我们使用的是内存中的用户信息,实际项目中需要连接 MySQL 或 Postgres 数据库,存储用户账户信息。

建议学习知识点

  • Spring Data JPA(数据库操作)
  • BCryptPasswordEncoder(加密密码)
  • 自定义 UserDetailsService

🔹 进阶方向2:RBAC 权限管理模型

学会如何设计 “角色-权限-菜单” 三级权限体系,实现不同用户看到不同的功能模块。

建议知识点

  • Spring Security + Thymeleaf 权限标签
  • 多角色管理
  • 自定义权限判断逻辑

🔹 进阶方向3:JWT + RESTful API 安全

如果你想做前后端分离项目(例如搭配 Vue/React),你需要掌握 JWT(JSON Web Token)身份令牌认证方式。

建议知识点

  • JWT 原理及使用
  • 自定义 Filter
  • Token 刷新机制

✨结语:

通过本文,你应该已经掌握了 Spring Security 的初步使用,包括基本的安全配置、用户认证流程和简单项目的搭建。

记住一句话:任何技术都不是一蹴而就的,只要你坚持动手练习,慢慢积累经验,很快就能独立搭建出自己的安全系统啦!

如果你觉得这篇文章对你有帮助,记得点赞+收藏哦!

📌 下期预告:《Spring Security进阶:连接数据库实现用户登录》敬请期待!

评论 0

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