Spring Security 基础:快速搭建安全认证系统(适合零基础新手)

Docker搬运工
2025-06-18 16:18
阅读 458

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

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

你是不是经常听别人说“后台接口要加权限控制”、“用户登录后才能访问资源”这些话?那怎么实现呢?这时候就要请出 Spring Security 了!

✨ Spring Security 是一款为 Java 后端应用提供安全保障的框架。它可以轻松帮助我们实现:

  • 用户登录验证(谁可以访问我的系统)
  • 权限管理(不同用户有不同的权限)
  • 安全防护(防止非法访问、CSRF攻击等)

想象一下你开了一家网上商城,你肯定不希望所有人都能进后台去修改商品价格吧?这时候 Spring Security 就相当于这个商城系统的门禁系统。


环境准备:动手之前先把工具准备好

环境准备:动手之前先把工具准备好

开始前,你需要准备以下开发环境:

工具列表:

名称 推荐版本 备注
JDK 17 或以上 Java运行环境
IDE IntelliJ IDEA / Eclipse 推荐使用IDEA,更友好
Spring Boot 3.0以上 我们将用它来快速构建项目
Maven 内置在IDE中 依赖管理工具

第一步:创建一个Spring Boot项目

你可以使用 Spring Initializr 快速生成初始项目。

👉 配置如下:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 最新稳定版(如 3.2.x)
  • Dependencies:
    • Spring Web (用于写API)
    • Spring Security (我们要学的核心)
    • Thymeleaf(可选,用来做简单页面演示)

点击 Generate 按钮下载zip包,解压后导入IDE即可。


核心概念:5分钟搞懂Spring Security的基本术语

核心概念:5分钟搞懂Spring Security的基本术语

学习Spring Security,这几个词必须懂👇

1. 认证 (Authentication)

就是“你是谁”的问题。用户输入用户名密码,系统确认身份是否正确。

2. 授权 (Authorization)

就是“你能做什么”的问题。比如管理员可以删用户,普通用户不能。

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

  • 角色:是一个分组,类似“用户组”,比如 ROLE_ADMIN、ROLE_USER。
  • 权限:是更细粒度的控制,比如 “read_article”、“delete_user”。

小比喻:班级里老师有“班主任”角色,有“批改作业”的权限。

4. 过滤器链(Filter Chain)

这是Spring Security的“安检通道”,每一个请求进来都会经过这一系列“检查点”。


实战项目:从零开始搭建一个登录认证系统

接下来我们要一步步做出一个简单的Spring Boot + Spring Security 项目。

第1步:添加依赖

打开 pom.xml 文件,确保已经包含以下依赖:

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

只要你引入了上面这两个依赖,Spring Security就已经开始自动起作用了。

第2步:编写一个最简单的Security配置类

新建一个Java类,比如叫 SecurityConfig.java,内容如下:

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
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.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((requests) -> requests
                .anyRequest().authenticated()
            )
            .formLogin(Customizer.withDefaults()) // 使用默认登录表单
            .logout(Customizer.withDefaults());    // 启用默认退出功能

        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();

        return new InMemoryUserDetailsManager(user);
    }
}

这段代码做了几件事:

✅ 设置所有请求都要登录后才能访问
✅ 启用了默认的登录页和退出功能
✅ 添加了一个内存中的用户:用户名是 user,密码是 password,属于 USER 角色

第3步:写一个测试API接口

创建一个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 hello() {
        return "欢迎来到受保护的世界!";
    }
}

启动项目,访问 http://localhost:8080/,你会看到:

🎉 弹出一个默认的登录页面!

使用用户名 user,密码 password 登录,你就能看到我们的欢迎语啦!


第4步:给不同用户分配不同的权限

现在我们来升级一下,支持多个用户和不同角色。

修改 SecurityConfig.java 中的 userDetailsService() 方法,增加两个用户:

@Bean
public UserDetailsService userDetailsService() {
    UserDetails user = User.withDefaultPasswordEncoder()
        .username("user")
        .password("password")
        .roles("USER")
        .build();

    UserDetails admin = User.withDefaultPasswordEncoder()
        .username("admin")
        .password("adminpass")
        .roles("ADMIN")
        .build();

    return new InMemoryUserDetailsManager(user, admin);
}

同时,我们修改Security策略,让 /admin 路径只能由 ADMIN 角色访问:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests((requests) -> requests
            .requestMatchers("/").permitAll()
            .requestMatchers("/admin").hasRole("ADMIN") // 只允许admin访问
            .anyRequest().authenticated()
        )
        .formLogin(Customizer.withDefaults())
        .logout(Customizer.withDefaults());

    return http.build();
}

重启项目:

  • 访问 /:任意用户都可以看
  • 访问 /admin:只有 admin 用户能看,其他用户会看到403拒绝访问

✅ 成功实现基于角色的访问控制!


常见问题解答

❓为什么我登录总是失败?

可能原因:

  1. 密码错误(注意大小写)
  2. 用户名未注册,请检查 userDetailsService
  3. 没有启用登录表单,确认 .formLogin(...) 是否开启

❓如何跳过登录直接访问某些接口?

使用 .permitAll() 即可放行:

.requestMatchers("/login", "/home").permitAll()

❓Spring Security默认的登录页是啥样子?

是Spring Security自带的一个非常简陋的HTML登录页,适合测试,但不适合生产环境使用。

实际项目中我们会自定义登录页面或使用JWT进行无状态登录。


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

恭喜你成功完成第一个Spring Security项目!下面是一些进一步学习的方向:

🧠 继续学习方向

学习模块 简要介绍
自定义登录页面 替换Spring默认页面,使用Thymeleaf开发
数据库用户管理 把用户存在MySQL,代替内存用户
JWT认证 支持前后端分离架构
OAuth2协议集成 实现第三方登录(如微信、GitHub)
方法级权限控制 控制某一个方法的访问权限

📚 推荐学习资料

  • Spring Security官方文档
  • B站《Spring Boot + Spring Security入门教程》
  • GitHub搜索关键词“spring security demo”
  • 极客时间《Java安全攻防实战》课程(高阶)

总结回顾

这篇文章带大家完成了以下步骤:

✅ 了解了Spring Security是用来干嘛的
✅ 搭建了开发环境并创建了Spring Boot项目
✅ 学会了基本的认证、授权机制
✅ 动手实现了用户登录、角色控制等功能
✅ 解决了一些常见问题
✅ 指明了后续学习方向

✅ 温馨提示:编程最好的方式就是边学边练!不要只看不动手哦~

如果你喜欢本教程,欢迎继续关注“Spring Boot + Spring Security + Redis 实现持久化登录”等更多实用章节!


📚 文章字数:约2601字

评论 0

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