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

郑杰
2025-06-27 01:19
阅读 201

一、Spring Security 是什么?

一、Spring Security 是什么?

你可能已经听说过“Spring Boot”,它是用来开发 Java 后端服务的一个流行框架。而 Spring Security,则是 Spring 家族中专门负责“权限控制和安全验证”的工具。简单来说,它能帮你轻松实现:

  • 登录认证(用户登录后才能访问某些页面)
  • 权限管理(不同角色能看到或操作不同的内容)
  • 防止常见攻击(如 CSRF 攻击)

不管你是做一个博客系统、电商网站还是企业管理系统,只要涉及到“谁可以看,谁不能看”,都需要用到 Spring Security。


二、环境准备

API接口文档-1

二、环境准备

1. 开发工具安装

为了顺利学习本教程,你需要准备好以下软件环境:

(1)Java JDK

推荐使用 JDK 17 或更高版本。可以从官网下载:
👉 https://www.oracle.com/java/technologies/javase-jdk17-downloads.html

安装完成后,在终端输入命令查看是否安装成功:

java -version
javac -version

(2)IDE(集成开发环境)

推荐使用 IntelliJ IDEA 或 Eclipse,本文以 IntelliJ IDEA 社区版为例。
下载地址:https://www.jetbrains.com/idea/download/

(3)Maven 构建工具

Spring Security 是基于 Maven 的项目管理工具。你可以通过以下方式确认:

mvn --version

如果没有安装,可以通过下面的链接下载安装: https://maven.apache.org/download.cgi

2. 创建 Spring Boot 项目

现在我们来创建一个新的 Spring Boot 项目:

方法一:使用 start.spring.io

  1. 访问网址:start.spring.io
  2. 配置如下:
    • Project: Maven
    • Language: Java
    • Spring Boot Version: 最新稳定版(比如 3.1.x)
    • Group: com.example
    • Artifact: security-demo
    • Dependencies:
      • Spring Web
      • Spring Security

微服务架构示意图-2

然后点击 “Generate” 下载项目压缩包,解压后导入 IDE 即可。

方法二:在 IntelliJ 中直接新建 Spring Initializr 项目

选择 File -> New -> Project -> Spring Initializr,然后同样添加依赖即可。


三、Spring Security 核心概念讲解(新手友好版)

我们用最通俗的方式讲解几个重要的核心概念:

1. 用户认证(Authentication)

就是判断“你是谁”。比如你在登录页面输入用户名和密码,系统会检查是否匹配数据库中的记录。如果匹配成功,就认为你“合法”。

举个生活例子:你进小区的时候要刷门禁卡。这就是“认证”的过程。

2. 授权(Authorization)

就是判断“你能做什么”。即使你进门了,也不一定能看到保安室或者机房。这些“权限”是不一样的。

再举例:学生可以查自己的成绩,老师可以看到全班的成绩,管理员可以修改成绩——这叫权限分级

3. 用户角色(Role)

角色就是一个分类标签。比如:

  • 角色 ROLE_USER:普通用户
  • 角色 ROLE_ADMIN:管理员

你可以理解为一种“通行证”。拥有哪些角色,就能访问哪些资源。

4. 安全过滤器链(Security Filter Chain)

这是 Spring Security 处理请求的安全流程机制。我们可以把它理解成“安检门”,所有进入系统的请求都要经过它一层层检查,比如:是否登录、是否有权限等。


四、实战项目:从零开始搭建一个安全系统

我们来写一个非常简单的 Spring Boot + Spring Security 应用,包含两个接口:

  1. /hello:所有人都可以访问
  2. /admin:只有管理员才能访问

第一步:导入 Spring Security 依赖

打开 pom.xml 文件,确保包含如下依赖(如果使用 start.spring.io 创建项目,默认就会加上):

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

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

第二步:编写控制器类

新建一个 Controller 类:HelloController.java

package com.example.securitydemo.controller;

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

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "欢迎访问公开页面!";
    }

    @GetMapping("/admin")
    public String adminOnly() {
        return "欢迎进入管理员页面!";
    }
}

第三步:配置安全规则

接下来我们要告诉 Spring Security,哪些人可以访问哪些页面。

新建一个类: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 userDetailsService() {
        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);
    }

    // 定义安全规则
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((requests) -> requests
            .requestMatchers("/hello").permitAll()  // 允许所有人访问
            .requestMatchers("/admin").hasRole("ADMIN")  // 只有管理员可以访问
            .anyRequest().authenticated()  // 其他路径必须登录
        )
        .formLogin();  // 使用默认登录页(自动生成一个登录界面)

        return http.build();
    }
}

第四步:运行并测试程序

启动你的 Spring Boot 程序,然后打开浏览器访问:

尝试使用下面这两个用户:

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

试着用普通用户登录看看能不能访问 /admin 页面?

👉 应该会提示没有权限 —— 这说明我们的权限控制生效啦!


五、新手常见问题解答(FAQ)

Q1:为什么每次启动 Spring Security 都有随机生成的密码?

当你引入了 Spring Security,并没有设置自己的用户时,Spring Boot 会自动生成一个默认用户(用户名为 user),并在启动日志中打印出临时密码,例如:

Using generated security password: abcdef123456

这是为了防止你忘记设置安全密码。建议自己定义好用户。


Q2:我设置了用户,但为什么登录不了?

常见原因如下:

✅ 是否把用户名或密码输错了?
✅ 是否没有加 .withDefaultPasswordEncoder()
✅ 是否配置了正确的 Role?比如是不是写成了小写的 "user",而配置里用的是 "USER"(大小写敏感!)


Q3:为什么访问 /admin 没弹出登录页?而是报错 403 Forbidden

可能是你没有加上 .formLogin() 配置。这个方法的作用就是启用一个默认的登录页面。


Q4:我可以不设置密码吗?

不可以。Spring Security 要求每个用户都必须设置密码。哪怕你使用第三方登录(如微信),内部也需要一个唯一标识符和凭证。


Q5:为什么说 .withDefaultPasswordEncoder() 不推荐生产使用?

因为这个方法使用的是明文加密算法(SHA-256),安全性不够高。在正式项目中,建议使用更安全的加密方式,比如 BCryptPasswordEncoder(我们后面会讲)。


六、学习建议(下一步学什么?)

恭喜你完成了第一个 Spring Security 小项目!你现在已经是初学者的佼佼者了 😄

如果你还想深入掌握 Spring Security,建议后续学习以下方向:

🔹 第一步:理解表单登录与注销机制

  • 学习如何自定义登录页面
  • 实现记住我功能
  • 实现注销功能

🔹 第二步:使用数据库存储用户信息

目前我们用的是内存中的用户数据,真实项目要用数据库。可以学习使用:

  • Spring Data JPA + MySQL
  • 自定义 UserDetailsService

🔹 第三步:学习 JWT(无状态鉴权)

适用于前后端分离项目,如 Vue + Spring Boot。 了解什么是 token、JWT 原理、如何结合 Spring Security 使用。

🔹 第四步:学习 OAuth2(第三方登录)

比如 GitHub、QQ、微信登录,都是基于 OAuth2 协议实现的,这也是很多大厂项目的标准做法。


总结一下

在这篇教程中,我们一起完成了以下任务:

  • 了解了什么是 Spring Security 以及它的作用
  • 配置好了开发环境
  • 理解了认证、授权、角色等基本概念
  • 写了一个支持用户登录和权限控制的小程序
  • 解决了一些常见的新人问题
  • 明确了后续学习路线

下一次课程,我们将会一起学习【如何连接数据库做真正的用户登录系统】,敬请期待!

评论 0

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