Spring Security基础:快速搭建安全认证系统(适合零基础新手)

云端小木屋
2025-06-18 17:13
阅读 358

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

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

在现代互联网应用中,安全性是非常关键的一环。无论你是开发一个电商网站、社交平台,还是企业内部系统,用户的数据都需要得到保护,不能随便被别人访问或篡改。

那怎么实现这个安全控制呢?这里就要提到一个非常流行的 Java 安全框架 —— Spring Security

通俗解释:

你可以把 Spring Security 想象成一个“保安”,它会站在你的 Web 应用门口,负责检查每一个进来的用户是不是“合法的访客”,有没有权限去你想去的地方。

比如:

  • 普通用户只能看到首页
  • 管理员可以进入后台管理页面
  • 未登录用户不能查看会员内容

这些事情 Spring Security 都能帮你搞定!

🎯 本教程目标:手把手带你从零开始搭建一个拥有基本登录和权限控制功能的安全认证系统。即使是编程小白,也能一步步跟着做出来!


第一步:环境准备(超详细步骤)

第一步:环境准备(超详细步骤)

在写代码之前,我们要准备好开发环境。

所需软件安装清单:

软件 下载地址 版本建议
Java JDK 17+ Oracle 或 OpenJDK 最好使用 LTS 版本
IntelliJ IDEA 或 VS Code IDEA下载页VSCode官网 社区版免费可用
Spring Boot Initializr 在线工具:start.spring.io 自动生成项目模板

操作步骤详解:

✅ 步骤1:下载并安装 JDK

  • Windows 用户下载 MSI 安装包即可
  • 安装完成后,打开命令行输入 java -versionjavac -version,看是否显示版本号

✅ 步骤2:安装 IDE

推荐使用 IntelliJ IDEA Community Edition(社区版)非常适合初学者。下载后一路安装即可。

✅ 步骤3:使用 Spring Boot Initializr 创建项目

  1. 访问 https://start.spring.io
  2. 按照下表填写信息:
参数名称 建议值
Project Maven
Language Java
Spring Boot Version 推荐最新稳定版(如 3.2.x)
Group com.example
Artifact springsecuritydemo
Name SpringSecurityDemo
Packaging Jar
Java 17 或以上

添加依赖项:

  • Spring Web (网页请求处理)
  • Spring Security (我们要学习的核心模块)

✅ 点击 “Generate” 按钮下载 ZIP 项目包,解压后用 IntelliJ IDEA 打开。


第二步:核心概念讲解(不讲术语,只说大白话)

第二步:核心概念讲解(不讲术语,只说大白话)

为了帮助你理解 Spring Security 是如何工作的,我们先了解几个最核心的概念。

核心概念一:认证(Authentication)

👉 就是“确认你是谁”。

想象你去银行取钱,柜员会让你出示身份证,并核对上面的照片是否是你本人。这就是一次“身份认证”。

在程序里,认证就是验证用户输入的用户名和密码是否正确。

核心概念二:授权(Authorization)

👉 知道你是谁之后,判断你能干什么。

比如说你是普通员工,只能查看自己的工资;如果你是经理,就能看全组的工资。

在 Spring Security 中,可以通过角色或者权限来控制谁能访问哪些资源。

核心概念三:过滤器链(Filter Chain)

👉 Spring Security 使用一系列“过滤器”来处理每个请求。

你可以把这些过滤器看作是一系列安检门:用户每发一个请求,都要通过这些门,每一道门都会检查是否有问题。

例如:有没有登录?有没有权限?是不是非法攻击?


第三步:实战演练 —— 搭建第一个 Spring Security 安全系统

我们将从一个简单的 Web 应用入手,一步一步添加安全机制。

🧪 项目结构说明(不用自己写目录,Initializr 已经帮我们生成好了):

springsecuritydemo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   └── resources/
│   └── test/
└── pom.xml (项目配置文件)

我们主要会在 src/main/java 下新建控制器类。

🚩Step 1:创建测试页面控制器

我们先不加安全功能,只是做一个普通的 Web 页面。

com.example.springsecuritydemo.controller 包下新建类 HomeController.java

package com.example.springsecuritydemo.controller;

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

@RestController
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "欢迎来到首页!";
    }

    @GetMapping("/user")
    public String userPage() {
        return "这是用户页面!只有登录用户才能看到。";
    }

    @GetMapping("/admin")
    public String adminPage() {
        return "这是管理员页面!只有管理员才能看到。";
    }
}

运行主类 SpringSecurityDemoApplication.java,然后访问:

  • http://localhost:8080 → 显示欢迎语
  • /user 和 /admin 也可以直接访问(现在没有限制)

接下来我们就加入安全控制。

🚩Step 2:启用安全配置

我们需要新建一个配置类来开启安全设置。

创建新类 SecurityConfig.java

package com.example.springsecuritydemo.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.withDefaultPasswordEncoder()
                .username("user")
                .password("user123")
                .roles("USER")
                .build();

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

        return new InMemoryUserDetailsManager(user, admin);
    }

    // 设置安全规则
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                    .requestMatchers("/").permitAll()
                    .requestMatchers("/user").hasRole("USER")
                    .requestMatchers("/admin").hasRole("ADMIN")
            )
            .formLogin(login -> login
                    .loginPage("/login") // 登录页面路径(稍后创建)
                    .permitAll()
            )
            .logout(logout -> logout.permitAll());

        return http.build();
    }
}

API接口文档-2

🔍 注意点:

  • 我们使用的是内存用户,适合演示
  • 实际项目应该从数据库加载用户信息
  • 密码编码方式已经简化为 .withDefaultPasswordEncoder(),方便入门

🚩Step 3:创建登录页面

虽然 Spring Security 默认提供了登录界面,但我们也可以自定义一个更友好的页面。

src/main/resources/templates 文件夹中新建 login.html 文件:

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

    <!-- 提示错误 -->
    <div th:if="${param.error}">
        用户名或密码错误。
    </div>
</body>
</html>

还需要添加一个控制器来渲染登录页面:

在 controller 包中新增 LoginController.java

@GetMapping("/login")
public String loginPage() {
    return "login";
}

现在重启项目,访问 /login 就可以看到登录页了。

尝试登录:

  • user / user123 → 成功进入 /user 页面
  • admin / admin123 → 成功进入 /admin 页面
  • 错误密码 → 显示错误提示

🎉 到此为止,你已经完成了 Spring Security 的最基础认证 + 授权功能!


第四步:常见问题答疑(新手高频踩坑汇总)

❓ Q1:忘记密码怎么办?Spring Security 支持修改密码吗?

在当前例子中,用户密码是硬编码在代码里的,不支持动态修改。实际项目中可以从数据库读取密码,这样就可以提供修改密码的功能。

❓ Q2:为什么我的访问路径总是跳回登录页面?明明账号密码是对的!

可能原因:

  • 是否开启了 CSRF?有些安全策略需要配合 token 验证
  • 表单提交方法是否正确?POST 请求要对应 <form method="post">
  • 角色权限是否匹配?比如访问 /admin 需要有 ADMIN 角色

❓ Q3:能不能让多个角色访问同一个页面?

当然可以。例如:

.requestMatchers("/user").hasAnyRole("USER", "ADMIN")

表示 USER 或 ADMIN 都有权限访问该页面。

❓ Q4:密码不能明文存储,我应该怎么加密?

Spring Security 提供多种加密方式,比如 BCryptPasswordEncoder,我们会在这个系列的后续文章中深入讲解。


第五步:下一步学习建议(别停下,继续成长!)

你现在掌握了一个非常重要的技能:使用 Spring Security 控制用户登录和访问权限

想要进一步提升能力,可以考虑以下方向:

✅ 1. 连接数据库做真实用户登录

  • 学习 JPA 或 MyBatis
  • 实现从数据库中加载用户信息

✅ 2. 添加“记住我”功能

  • 使浏览器记住登录状态一段时间

✅ 3. 使用 JWT(前后端分离架构常用)

  • 替代传统的 Session 登录方式

✅ 4. 使用 OAuth2 协议(如微信、QQ登录)

  • 实现第三方登录功能

总结回顾(一句话重点)

服务器部署方案-1

  • Spring Security 是用来控制 Web 应用访问权限的框架
  • 可以实现“用户登录”、“权限分级”等功能
  • 本教程带你实现了用户/管理员不同级别的访问控制
  • 后续还可以扩展数据库集成、JWT等高级功能

💡 如果你喜欢这篇教程,欢迎点赞分享,并关注后续更深入的文章(如《Spring Security进阶:整合数据库+RBAC权限模型》)!

有任何问题都可以留言提问,我会一一解答 👋


【全文约 3565 字】

评论 0

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