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

一人公司实验室
2025-06-13 16:26
阅读 716

一、开篇:什么是 Spring Security?

一、开篇:什么是 Spring Security?

如果你刚开始接触后端开发,可能听说过一个叫 Spring 的框架。它是一个非常流行的 Java 框架,帮助我们更轻松地构建 Web 应用程序。

那么问题来了:我们写了一个网站或者 App 的后台系统,如何保护这个系统的安全性?比如:

  • 如何限制只有注册用户才能访问某些页面?
  • 如何验证用户的身份?
  • 如何区分管理员和其他普通用户的权限?

这时候,Spring Security 就派上用场了。

✨ Spring Security 是什么?

简单来说,Spring Security 是一个为 Spring 应用提供安全功能的框架。它可以帮你实现:

  • 用户登录(认证)
  • 权限控制(授权)
  • 防止常见的攻击(比如 CSRF、会话固定等)

你可以把它理解为给你的应用加上“门卫”和“保安系统”,防止未经授权的人随意进出。

在本教程中,我们将从零开始,带你一步步搭建一个拥有基本安全功能的 Web 应用!


二、环境准备:我们需要准备什么?

二、环境准备:我们需要准备什么?

为了顺利完成接下来的实战项目,我们需要先准备好以下工具和依赖:

🧰 开发工具推荐:

  1. Java 8 或更高版本
  2. IDE(如 IntelliJ IDEA 或 Eclipse)
  3. Spring Boot Initializr 网站(用于生成基础项目结构)
  4. Maven 或 Gradle 构建工具

📦 添加 Spring Security 依赖:

使用 Spring Initializr 创建项目时,请添加以下依赖:

  • Spring Web (构建 Web 应用)
  • Spring Security
  • Thymeleaf(如果想加前端展示页面)

然后下载生成好的项目压缩包,解压并导入 IDE 中。

💡 小贴士:如果使用的是 Maven,在 pom.xml 文件里要看到类似这样的依赖:

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

这样我们就把 Spring Security 引入到项目中了。


三、核心概念讲解:你必须知道的安全术语

虽然你现在是新手,但掌握这些关键词可以让你在学习过程中少走弯路。

🔐 认证(Authentication)

通俗解释:就是“你是谁”。

举个例子:当你登录某宝账号的时候,输入用户名和密码的过程,就是在告诉系统“我是张三”。

🔒 授权(Authorization)

通俗解释:就是“你能干什么”。

例如:张三只能看订单;而客服人员还可以改订单信息,这就是不同角色有不同的权限。

👤 用户(User)与角色(Role)

  • 用户:具体操作系统的个体(比如张三)
  • 角色:用户拥有的身份或权限标签(如 ROLE_USER、ROLE_ADMIN)

🗝️ 安全配置类(SecurityConfig)

这是你编写安全策略的地方,告诉 Spring Security:

  • 谁能访问哪些资源?
  • 登录页面在哪里?
  • 登出行为如何处理?

四、实战项目:一步步创建一个简单的安全认证系统

接下来,我们将用最直观的方式,一步一步教你在 Spring Boot 中加入登录验证功能。

步骤 1:新建一个简单的网页接口

首先,在 src/main/java 下面找到你的主类,通常是格式为:YourProjectNameApplication.java

然后新建一个 Controller 类来创建网页路由。

文件路径建议为:
src/main/java/com/example/demo/controller/HomeController.java

代码如下:

package com.example.demo.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 "这是管理员页面!";
    }
}

现在启动你的 Spring Boot 项目,在浏览器打开:

  • http://localhost:8080 → 返回“欢迎来到主页!”
  • /user 和 /admin 页面也能直接访问!

但这不对吧?我们希望设置一些页面只允许特定用户访问。

所以,下一步就该引入 Spring Security 进行限制啦!


步骤 2:创建安全配置类

我们需要创建一个类,来定义我们的安全规则。

新建文件:src/main/java/com/example/demo/config/SecurityConfig.java

内容如下:

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
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;


![服务器部署方案-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025061316/65caa5a5-c7d6-4cec-8fdc-370f96680d91.jpg)


@EnableWebSecurity  // 启用 Spring Security 功能
public class SecurityConfig {

    // 设置两个内存中的用户,模拟数据库登录
    @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);
    }

    // 定义 URL 的访问规则
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .requestMatchers("/").permitAll()
                .requestMatchers("/user").hasRole("USER")
                .requestMatchers("/admin").hasRole("ADMIN")
                .and()
            .formLogin();  // 启用默认登录页

        return http.build();
    }
}

这段代码做了几件重要的事情:

功能 解释
注册两个内存用户 username: user / password: 123456 & admin / admin123
不同的 URL 配置不同权限 "/" 公共可访问,"/user" 只有 USER 能访问,"/admin" 需要 ADMIN
formLogin() 方法 自动为我们生成登录页面

现在再运行项目,尝试访问:

  • /user 页面 → 会自动跳转到登录页
  • 输入用户名和密码登录后,就能访问对应的内容啦!

步骤 3:定制登录页面(选学)

默认的登录页面很简单,如果我们想自定义登录页怎么做呢?

可以使用 Thymeleaf 来渲染 HTML 页面。假设我们在 resources 目录下新建一个 HTML 文件:

路径:src/main/resources/templates/login.html

内容示例:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>登录页面</title>
</head>
<body>
<h2>登录系统</h2>

<form th:action="@{/login}" method="post">
    <label>用户名:</label>
    <input type="text" name="username" />
    <br/>
    <label>密码:</label>
    <input type="password" name="password"/>
    <br/>
    <button type="submit">登录</button>
</form>
</body>
</html>

然后再修改 SecurityConfig.java 中的 .formLogin() 一行,换成:

.formLogin(login -> login
    .loginPage("/my-login")   // 使用我们自己的登录页
    .defaultSuccessUrl("/")   // 登录成功后返回主页
    .permitAll()
)

并在 Controller 里添加一个方法显示登录页:

@GetMapping("/my-login")
public String loginPage() {
    return "login"; // 对应 templates 下的 login.html
}

完成之后访问 /my-login 就可以看到我们自己设计的登录界面啦!


五、常见问题解答(FAQ)

刚学习的同学经常遇到这些问题,我们整理出来供你参考:

❓ Q1:为什么我输入正确的用户名密码却无法登录?

原因&解决办法:

  • 用户名或密码写错了。
  • 请确保密码用了 .withDefaultPasswordEncoder() 加密方式,如果是纯字符串,可能会因加密不匹配导致失败。
  • 检查是否忘记添加 .formLogin() 导致无法触发登录流程。

❓ Q2:所有请求都被拦截了怎么办?

原因&解决办法:

  • 你没有用 .permitAll() 放开不需要登录即可访问的页面。
  • 检查 authorizeRequests() 中的规则配置顺序是否有冲突。

❓ Q3:我想让用户登录后跳转到指定页面怎么办?

解决办法: 在登录配置里设置 defaultSuccessUrl("/user") 即可,参数是你想要跳转的页面地址。


❓ Q4:退出登录不起作用?

解决办法: 需要开启登出功能,默认关闭。只需在配置中加上 .logout().permitAll() 即可启用 logout 请求。


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

恭喜你已经完成了 Spring Security 的第一个入门项目!

接下来你可以继续深入学习:

✅ 建议路线:

  1. 学习使用数据库进行用户认证(不再是内存用户)
  2. 学习 RBAC 权限模型(用户 - 角色 - 权限管理)
  3. 学习 JWT + Spring Security 实现无状态 API 认证
  4. 了解 OAuth2 第三方登录机制(如微信、QQ 登录)

总结回顾

今天我们完成了:

✅ 搭建 Spring Boot + Spring Security 基础项目
✅ 创建多个页面并设置访问权限
✅ 学习登录验证、角色控制的基本原理
✅ 了解常见问题排查方法


📌 温馨提醒:技术学习重在动手!不要光看文章,一定要跟着敲一遍代码。遇到问题记得善用 Google 或 StackOverflow 提问哦!

祝你在编程的路上越走越远!💡

评论 0

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