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

一行代码半杯茶
2025-06-14 22:56
阅读 621

开篇:Spring Security 是什么?

开篇:Spring Security 是什么?

如果你正在开发一个 Web 应用,比如后台管理系统、电商网站或用户注册登录功能,你一定会遇到这样一个问题:如何让不同的用户只能看到自己有权限看的内容?

这时候,你就需要使用 Spring Security。它是一个基于 Java 的强大安全管理框架,专门用来帮助开发者实现用户认证(登录)、权限控制(访问限制)和安全防护等功能。

在本教程中,我们会手把手带你从零开始,快速构建一个带有用户登录功能的 Spring Boot 项目。即使你是第一次接触 Spring Security,也能轻松上手!


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

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

所需环境:

  1. Java JDK 17 或更高版本
  2. IDE:推荐使用 IntelliJ IDEAVS Code
  3. Maven 构建工具(内置在大多数 IDE 中)
  4. 浏览器:Chrome、Edge、Firefox 均可
  5. Spring Boot 初始项目生成器https://start.spring.io/

步骤说明:

第一步:创建 Spring Boot 项目

  1. 打开浏览器访问 https://start.spring.io/
  2. 配置如下内容:
    • Project: Maven
    • Language: Java
    • Spring Boot Version: 推荐选择最新稳定版(如 3.x)
    • Group: com.example
    • Artifact: securitydemo
    • Dependencies:
      • Spring Web
      • Spring Security

点击 Generate 下载 ZIP 文件并解压,然后导入到你的 IDE 中。

第二步:启动应用

在你的 IDE 中找到 SecuritydemoApplication.java 文件,运行这个类中的 main 方法。

打开浏览器访问 http://localhost:8080,你应该会看到 Spring Security 默认的登录页面 —— 这是因为我们已经引入了 Spring Security 依赖,默认启用了安全保护。

接下来,我们来深入了解它的原理,并手动配置我们的第一个安全规则。


核心概念:通俗易懂地理解关键概念

API接口文档-1

核心概念:通俗易懂地理解关键概念

在正式编写代码之前,我们先了解几个关键概念,这些是你理解和使用 Spring Security 必须知道的基础词汇。

1. 认证(Authentication)

就是确认“你是谁”的过程。例如,输入用户名和密码登录就是一种认证方式。

2. 授权(Authorization)

即判断“你能做什么”。比如管理员可以查看所有用户信息,而普通用户只能看自己的信息。

3. 角色(Role)与权限(Authority)

  • 角色:表示身份类型,比如“管理员”、“普通用户”
  • 权限:表示具体能执行的操作,比如“读取文章”、“删除用户”

通常我们会根据角色来分配权限。

4. Filter(过滤器)

就像一道道安检门,用户访问接口时要经过这些“过滤器”,进行验证是否合法。


实战项目:一步步实现一个简单安全认证系统

实战项目:一步步实现一个简单安全认证系统

现在我们开始实战练习,目标是搭建一个包含以下功能的项目:

  • 访问首页不需要登录
  • 访问 /user 页面必须登录
  • 访问 /admin 页面必须是管理员角色才能访问

步骤一:添加基本网页接口

src/main/java/com/example/securitydemo/controller 路径下新建一个控制器文件:

package com.example.securitydemo.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 "这是管理员页面,仅限管理员访问";
    }
}

步骤二:配置安全策略

src/main/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 {

    // 定义两个用户:user 和 admin
    @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(configurer -> configurer
                    .requestMatchers("/").permitAll()
                    .requestMatchers("/user").authenticated()
                    .requestMatchers("/admin").hasRole("ADMIN"))
            .formLogin(form -> form.loginPage("/login").permitAll())
            .logout(logout -> logout.permitAll());

        return http.build();
    }
}

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

  • 创建两个测试用户:user(角色 USER)、admin(角色 ADMIN)
  • 配置 URL 权限控制:
    • /:所有人都可以访问
    • /user:必须登录
    • /admin:必须是 ADMIN 角色才能访问
  • 自定义登录页 /login 并允许所有人访问

但注意:我们还没有自定义登录页面,Spring Security 会提供默认的登录表单。访问 /user/admin,就会自动跳转到 /login 登录页面。

你可以直接使用前面定义的用户名和密码进行测试:

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

尝试分别以这两个账号登录,观察能否访问 /user/admin


常见问题解答

Q1:为什么我输入正确的账号密码还是登录失败?

A:检查是否正确设置了 .withDefaultPasswordEncoder(),如果忘记这个方法,密码格式不匹配会无法登录。
注意:这种方式只是演示用途,生产环境中应使用加密存储密码,如 BCrypt。


Q2:如何禁用 CSRF 防护?

A:有些前后端分离项目可能需要用到,在 SecurityConfig 中添加:

http.csrf(csrf -> csrf.disable());

不过建议保留此功能,除非明确知道自己在做什么。


Q3:如何退出登录?

A:访问 /logout 即可退出当前登录。该路径默认支持 GET 请求。


Q4:我想自定义登录页面怎么办?

A:我们可以添加一个 HTML 登录页面,并通过 controller 返回视图。这部分我们在进阶课程中详细讲解。


学习建议:下一步学什么?

恭喜你完成了第一个 Spring Security 小项目!你现在具备了:

  • 搭建 Spring Security 基础结构的能力
  • 管理用户和角色
  • 控制接口访问权限

接下来推荐你继续学习以下几个方向:

推荐主题 内容简介
Spring Security 注册功能实现 支持新用户注册和数据库保存
使用数据库做用户管理 用 MySQL 替换内存用户管理
JWT 令牌认证 适用于前后端分离和 API 安全性
OAuth2 第三方登录 如微信、Google 登录集成
方法级安全控制 使用 @PreAuthorize 在方法上做权限控制

总结

在这篇文章中,我们以实践驱动的方式讲解了 Spring Security 的基础使用。通过一个简单的项目,你学会了如何配置用户、设置权限,并对不同页面进行访问控制。

记住一句话:“安全不是事后补救,而是设计之初就要考虑的部分。”

希望这篇教程能成为你迈向安全开发的第一步。如果你喜欢这种风格,记得点赞、收藏、分享给其他刚入门的同学 😊


📌 资源链接推荐

评论 0

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