Spring Security基础:快速搭建安全认证系统(面向零基础)

山海写码人
2025-06-22 19:35
阅读 432

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

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

在开发Web应用的时候,安全性是非常重要的一环。你肯定不希望随便一个人都能访问你的后台数据,对吧?这时候,就需要一个工具来帮助我们控制“谁可以访问什么”。

Spring Security就是这样一个工具 —— 它是为Java开发者设计的权限管理框架,能够帮助我们在Spring项目中非常方便地实现用户登录、权限控制、加密存储等安全功能。

简单来说,它的作用包括:

  • 用户必须登录才能访问某些页面
  • 不同的用户有不同的权限,比如普通用户和管理员能看到的内容不同
  • 密码不能以明文形式存入数据库,需要加密处理
  • 可以防御一些常见的攻击,比如CSRF攻击

这篇文章的目标是:带领你用最简单的方式,在一个空白项目里加入Spring Security的基本安全认证功能。


环境准备:你需要哪些工具和环境?

环境准备:你需要哪些工具和环境?

要开始我们的第一个Spring Security项目,我们需要准备好以下开发环境。

1. Java开发环境

推荐使用 JDK 17,它是一个稳定版本,兼容性好。你可以从 Oracle官网Adoptium 下载并安装。

安装完成后,在命令行运行:

java -version

如果看到类似下面的信息说明安装成功:

openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7)
OpenJDK 64-Bit Server VM (build 17.0.8+7, mixed mode, sharing)

2. 构建工具:Maven

Spring Boot项目通常使用Maven作为依赖管理工具。如果你还没有安装Maven,可以从官网下载安装。

安装后检查:

mvn -v

3. IDE推荐:IntelliJ IDEA 社区版

新手强烈建议使用 IntelliJ IDEA(社区版免费),它对Spring Boot有很好的支持。当然也可以使用VSCode + Java扩展,不过IDEA会更方便些。

4. 创建项目:通过Spring Initializr

我们可以借助官方的在线生成器快速创建项目骨架:

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

设置如下选项:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 最新版(例如3.2.x)
  • Group: com.example
  • Artifact: security-demo
  • Name: SecurityDemoApplication
  • Dependencies:
    • Spring Web
    • Spring Security

点击 Generate 下载项目压缩包,并解压到本地。


核心概念:Spring Security中最常见的几个术语解释

核心概念:Spring Security中最常见的几个术语解释

为了让我们更好地理解接下来的代码,先来看看几个核心的概念,用小白语言解释。

1. Authentication(身份验证)

说白了就是:“你是谁?” —— 你能通过用户名和密码证明自己的身份吗?

Spring Security通过一系列过滤器链来验证用户身份,比如检查是否提供了用户名和密码。

2. Authorization(授权)

意思是:“你能干什么?” —— 即使你是登录用户,也不一定能做所有事。比如普通用户无法访问后台管理页面。

3. SecurityFilterChain(安全过滤链)

这是一个流程图一样的结构,用来定义请求经过哪些安全检查,如是否登录、是否有权限访问某页面等等。

4. UserDetailsService(用户详情服务)

这个接口负责根据用户名查询用户信息,比如密码、权限等。

5. PasswordEncoder(密码编码器)

用于加密和验证密码,比如将用户输入的明文密码进行加密保存到数据库,避免密码泄露。


实战项目:一步步实现基本的登录认证

实战项目:一步步实现基本的登录认证

现在我们来实践一下,如何在一个Spring Boot项目中使用Spring Security实现用户登录和权限控制。

步骤1:导入依赖

打开 pom.xml 文件,确认是否已经引入如下两个关键依赖(Spring Security 和 Spring Web):

<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>

如果有,说明我们准备好了!

微服务架构示意图-2

步骤2:创建控制器

src/main/java/com/example/securitydemo/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 adminPage() {
        return "这是管理员页面,只有管理员才能看到哦~";
    }
}

目前还无法访问这两个页面,因为Spring Security默认开启了安全机制。

步骤3:开启Spring Security配置

我们需要手动添加一个配置类来告诉Spring Security怎么处理登录和权限。

创建 SecurityConfig.java,放在主包目录中(比如 com.example.securitydemo.config 包):

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.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(auth -> auth
                .requestMatchers("/hello").authenticated()  // 需要登录才能访问
                .requestMatchers("/admin").hasRole("ADMIN") // 必须是管理员角色才能访问
                .anyRequest().permitAll()
            )
            .formLogin(form -> form
                .loginPage("/login")   // 自定义登录页路径
                .permitAll()
            )
            .logout(logout -> logout
                .permitAll()
            );


![负载均衡配置-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025062219/30a54785-4ab1-4a1f-a082-7362b7845682.jpg)


        return http.build();
    }
}

这段配置的意思总结如下:

  • 定义了两个用户:user(普通用户)、admin(管理员)
  • /hello 接口要求用户必须登录
  • /admin 接口只允许具有 ADMIN 角色的用户访问
  • 登录页面路径是 /login(虽然我们还没写页面)
  • 支持退出登录

步骤4:启动项目并测试

执行项目的主类 SecurityDemoApplication.java 启动项目。

测试1:访问 /hello

浏览器访问:http://localhost:8080/hello

你会被重定向到默认登录页面(由Spring Security自动生成),输入用户名和密码:

  • 用户名:user
  • 密码:123456

提交后就可以看到页面内容了 ✅

测试2:访问 /admin

再次访问 http://localhost:8080/admin,你会发现即使你已登录,也无法进入该页面 —— 因为你只是普通用户。

换回用户名:admin / 密码:admin123 登录后,就可以正常访问 ❗️

小结一下现在的效果

  • 任何访客都必须登录才能访问 /hello
  • 仅限 ADMIN 角色才能访问 /admin
  • 普通用户看不到管理员页面

常见问题:新手常遇到的问题及解决方案

问题1:启动报错,提示“No static resource login”

你可能会看到日志中出现找不到 /login 页面的警告。

别担心!这是因为我们没有自己编写登录页面,默认情况下Spring Security会提供一个简单的登录表单。你直接访问受保护页面就会自动跳转到那个登录界面。

解决方法: 可以选择继续使用默认的登录界面,或者后面学习“自定义登录页面”部分去替换为自己写的前端。


问题2:忘记密码怎么办?

在这个例子中,用户数据保存在内存里,所以重启程序后还是原来的密码。但在实际项目中,这些用户数据应该来自数据库。


问题3:密码明文存储危险怎么办?

是的,我们示例中使用的 withDefaultPasswordEncoder() 是用于演示目的的,真实项目必须改用更强的加密方式,比如 BCryptPasswordEncoder。

我们会在这个教程的后续章节介绍。


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

掌握了Spring Security的基础之后,你就可以尝试学习更多进阶内容了:

进阶方向一:连接数据库(持久化用户)

  • 使用JPA或MyBatis与数据库连接
  • 使用 UserDetailsService 接口读取真实数据库中的用户信息

进阶方向二:自定义登录页面

  • 自己写HTML登录页面
  • 加入CSS美化
  • 处理验证码、记住我等功能

进阶方向三:整合JWT,打造前后端分离的安全体系

  • 适用于Vue、React等前端项目
  • 使用令牌代替Session

进阶方向四:RBAC权限模型学习

  • 学习基于角色和权限的复杂权限管理系统

结语:坚持就是胜利!

恭喜你完成了Spring Security的第一步学习!你现在拥有了一个带有登录验证和权限区分的完整小系统!

刚开始可能觉得有点抽象,但只要你动手跟着写了代码,就能慢慢理解其中的逻辑。

温馨提示:不要只看不动手!一定要亲自敲一遍代码,出错了也别怕,查错误的过程也是成长的一部分!

下一阶段我们将会一起学习“Spring Security结合数据库”的内容,记得持续关注哦!💪


如果你想获得完整的源码或其他Spring系列教程资源,可以在下方留言告诉我,我会继续更新相关内容!

评论 0

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