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

代码里的小宇宙
2025-06-21 19:36
阅读 752

开篇:什么是Spring Security?

开篇:什么是Spring Security?

你可能听说过“Spring框架”,它是一个广泛使用的Java开发框架,可以帮助我们更轻松地构建企业级应用程序。而Spring Security,就是这个大家族中专门负责“安全性”的成员。

简单来说,Spring Security 就是用来保护你的 Web 应用程序的“保安”工具箱。你可以通过它来实现以下功能:

  • 只有注册并登录的用户才能访问某些页面
  • 不同角色(比如管理员和普通用户)有不同的权限
  • 防止一些常见的网络攻击,比如跨站请求伪造(CSRF)

如果你正在开发一个带有登录注册功能的网站或后台系统,Spring Security 就是你不可或缺的好帮手。本教程将从零开始,一步步带你搭建一个简单的安全认证系统,适合完全没有经验的新手朋友。


环境准备:搭建我们的开发环境

环境准备:搭建我们的开发环境

在开始写代码之前,我们需要先准备好开发环境。别担心,这一步其实很简单。

1. 安装 Java 开发环境

确保你的电脑上已经安装了 JDK(Java Development Kit)。目前推荐使用 JDK 17 或以上版本

你可以通过命令行输入下面这条命令来查看是否已安装以及版本号:

java -version

如果显示类似如下内容,说明已安装成功:

openjdk version "17.0.5" 2022-10-18
OpenJDK Runtime Environment ...

如果没有安装,可以去Oracle官网或者使用 Adoptium 下载安装。


2. 安装开发工具 IntelliJ IDEA

推荐使用 IntelliJ IDEA Community Edition(免费版),这是一个非常强大且适合初学者的 Java IDE。

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

安装完成后打开即可。


3. 创建第一个 Spring Boot 项目

我们现在要创建一个基于 Spring Boot 的项目,这是快速开发 Java Web 应用的标准方式。

方法一:使用 Spring Initializr 网站

前往:https://start.spring.io/

按照以下步骤操作:

  • Project:选择 Maven
  • Language:Java
  • Spring Boot Version:选最新稳定版本(例如 3.0.x)
  • Groupcom.example
  • Artifactdemo
  • Dependencies:添加 Spring Web, Spring Security

点击 “Generate” 下载压缩包,解压后用 IntelliJ 打开即可。

方法二:直接在 IDEA 中新建项目

在 IntelliJ 中点击 File → New → Project
选择 Spring Initializr → 填写 Group、Artifact、Dependences 同样添加上述依赖即可。


4. 运行项目测试一下

找到项目中的主类(通常叫 DemoApplication.java),运行它。

控制台看到如下字样表示启动成功:

Tomcat started on port(s): 8080 (http)
Started DemoApplication in ... seconds

此时打开浏览器访问:http://localhost:8080
你会发现有一个默认的错误页面(因为我们还没写任何页面)——没关系,我们继续下一步。


核心概念:了解 Spring Security 的几个关键术语

API接口文档-1

核心概念:了解 Spring Security 的几个关键术语

为了方便理解,这里用最通俗的语言解释几个核心概念。

✅ 用户(User)

指使用我们系统的访客。Spring Security 中,用户信息通常是用户名 + 密码 + 权限。

我们可以把用户想象成一个个“通行证持有者”,他们需要通过验证才能进入系统。

✅ 认证(Authentication)

认证就是判断用户是谁的过程,也就是常说的“登录”。

举个例子:你在网页上输入了用户名 admin 和密码 123456,系统会检查这两个值是否匹配。如果匹配,你就被“认证通过”。

✅ 授权(Authorization)

授权是在认证之后进行的操作,用于判断某个用户是否有权访问某项资源。

比如说:普通用户只能看不能改数据;管理员却可以新增、删除、编辑数据。这就是授权在起作用。

✅ 角色(Role)

角色其实就是对用户的分类,比如:

  • ROLE_USER(普通用户)
  • ROLE_ADMIN(管理员)

不同角色拥有的权限不同。可以通过设置角色来控制谁可以做哪些事。

✅ 登录页 & 注册页

这些是供用户输入账号密码的地方。Spring Security 提供了默认的登录页,也可以自定义。


实战项目:跟着我一起写一个登录系统

现在我们正式动手做一个完整的例子:实现一个包含登录功能的小型网站。我们将完成以下几个功能:

  • 使用 Spring Security 提供的默认登录页
  • 配置内存中的用户账号
  • 设置不同的用户角色
  • 实现最基本的权限控制

Step 1:配置用户账号

application.properties 文件中配置两个用户账户:

spring.security.user.name=admin
spring.security.user.password=admin123
spring.security.user.roles=ADMIN

spring.security.user2.name=user
spring.security.user2.password=user123
spring.security.user2.roles=USER

这样我们就设置了两个账号:

用户名 密码 角色
admin admin123 ADMIN
user user123 USER

注意:这种方式只适用于学习和演示,在实际项目中应该使用数据库保存用户信息。


Step 2:创建几个简单的控制器方法

打开 src/main/java/com/example/demo/DemoController.java

编写一个控制器来展示两个不同级别的访问接口:

package com.example.demo;

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

@RestController
public class DemoController {

    // 普通用户都能访问的公开页面
    @GetMapping("/hello")
    public String hello() {
        return "你好,欢迎来到公共区域!";
    }

    // 只有管理员才可以访问的页面
    @GetMapping("/admin")
    public String adminOnly() {
        return "恭喜!你是管理员 👑";
    }
}

现在我们有两个 URL:

  • /hello —— 任何人都能访问
  • /admin —— 只有角色为 ADMIN 的人才能访问

Step 3:配置 Spring Security

接下来我们要告诉 Spring Security 哪些页面需要保护、谁可以访问。

创建一个新的类文件:SecurityConfig.java

package com.example.demo;

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.UserDetailsService;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    // 这个配置决定了哪些 URL 需要被保护,以及允许谁访问
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/hello").permitAll()
                .requestMatchers("/admin").hasRole("ADMIN") // 要求 ADMIN 角色
                .anyRequest().authenticated()
            )
            .formLogin(withDefaults()); // 使用默认的登录界面

        return http.build();
    }

    // 忽略用户详情服务的自动注入警告
    @Bean
    public UserDetailsService userDetailsService() {
        return null;
    }
}

上面的代码含义通俗解释:

  • /hello 是所有人都可以访问的公开页面。
  • /admin 页面必须是管理员角色(ADMIN)才能访问。
  • 其他所有未声明的页面都需要登录之后才能访问。
  • 使用 Spring Security 自带的登录页。

Step 4:测试运行你的安全系统

启动项目:

./mvnw spring-boot:run

访问以下两个地址试试效果:

试着输入我们在 application.properties 里配置好的账号:

  • 用户名:admin / user
  • 密码:admin123 / user123

登录后就能正常看到页面啦!

如果你用的是普通用户 user,访问 /admin 时就会收到拒绝访问的提示,这就说明权限控制已经生效了!


常见问题解答:新手容易遇到的问题与解决办法

❓1. 我输入正确的用户名和密码但总是登录失败怎么办?

✅ 有可能是因为没有开启 Spring Security 的登录功能。

确保你已经在 SecurityConfig.java 中启用了登录支持:

.formLogin(withDefaults())

并且 .anyRequest().authenticated() 表示必须登录才能访问。


❓2. 启动时报错找不到类或依赖?

✅ 检查 pom.xml 是否导入了正确的 Spring Security 依赖:

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

❓3. 浏览器提示访问被禁止(Forbidden)、403 错误?

✅ 一般是由 CSRF 保护机制引起的(Spring Security 默认启用)。

可以在 SecurityConfig.java 中暂时关闭这项功能,便于调试:

.csrf(csrf -> csrf.disable()) // 关闭 CSRF

⚠️ 注意:生产环境中不应轻易关闭,应使用合理的方式处理。


❓4. 我想修改默认的登录页路径?

✅ 你可以自己设计登录页面,然后在配置中指定:

.formLogin(login -> login.loginPage("/my-login"))

同时,你需要自己提供一个名为 /my-login 的 GET 请求处理逻辑,并返回一个表单页面。


❓5. 如何注销登录?

✅ Spring Security 提供了一个 /logout 路径。只需发送一个 POST 请求即可退出当前用户。

你可以添加一个注销链接:

<form action="/logout" method="POST">
    <button type="submit">退出登录</button>
</form>

记得加上 CSRF Token 支持哦!


学习建议:下一步的学习方向

学完本教程后,你应该已经掌握了 Spring Security 的基本用法。接下来建议你进一步学习以下主题:

🔹 更深入的身份验证方式

  • 数据库存储用户(如 MySQL + JDBC)
  • 社交登录(如 GitHub、微信等 OAuth2 支持)
  • JWT(前后端分离常用方案)

🔹 授权控制进阶

  • 动态权限管理(如菜单权限、按钮权限)
  • 基于表达式的访问控制(SpEL)
  • 方法级别权限控制(@PreAuthorize, @Secured)

🔹 实战项目推荐

尝试独立开发一个小项目,例如:

  • 博客后台管理系统(管理员增删文章)
  • 商城系统(普通用户查看商品,管理员维护库存)
  • 学生信息管理系统(老师与学生不同权限)

总结:Spring Security 入门就这么简单!

本教程介绍了如何使用 Spring Security 实现一个基础的用户登录与权限控制系统,包括以下几个关键点:

  • 准备好 Java 开发环境和 Spring Boot 工程
  • 了解 Spring Security 的几个核心概念(用户、认证、授权、角色)
  • 编写了登录系统的核心代码并测试运行
  • 解决了一些常见的问题
  • 给出了后续学习的方向

记住一句话:Spring Security 并不难,只要肯动手练!

随着你不断实践更多案例,你会越来越熟练地掌握这套强大的安全框架。希望这篇教程为你打开了通往安全编程世界的大门!


如果你觉得这篇教程对你有帮助,也欢迎分享给其他刚开始学习 Java Web 的小伙伴!一起加油吧 🚀

评论 0

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