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

前端里的光
2025-06-29 11:09
阅读 436

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

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

在我们开始编写网络应用时,安全性往往是最容易被忽略的部分之一。然而,在当今互联网环境中,用户数据泄露、非法登录等问题屡见不鲜,因此构建一个安全的后端系统已经成为开发过程中不可或缺的一环。

那什么是 Spring Security 呢?

简单来说,Spring Security 是 Spring 框架的一个子项目,专门用于处理 Web 应用程序中的安全问题。它就像一把“门锁”和“保安”,可以帮助我们:

  • 实现用户登录验证(Authentication)
  • 控制用户访问权限(Authorization)
  • 防止常见攻击(如CSRF攻击)

它的特点是灵活而强大,可以很容易地集成到基于 Spring Boot 的项目中。如果你的目标是构建一个拥有登录注册功能、角色权限控制的基础Web系统,那么从学习 Spring Security 开始是最合适的选择。

今天这篇教程就将带你一步一步实现这样一个系统。别担心你没有 Java 框架经验——只要你会写 Java,并且对 HTTP 协议有最基本的认识,就能完成本教程!


环境准备:搭建你的第一个 Spring Boot 项目

环境准备:搭建你的第一个 Spring Boot 项目

✅ 所需工具

  1. JDK 8 或以上版本(推荐使用 OpenJDK)
  2. Maven(自动下载依赖包)
  3. IntelliJ IDEA / Eclipse / VS Code + Java插件
  4. 浏览器和 Postman(测试API用)

🚀 步骤一:创建 Spring Boot 项目

你可以通过 Spring Initializr 快速生成项目结构:

  1. 访问链接。
  2. 选择以下配置:
    • Project: Maven
    • Language: Java
    • Spring Boot Version: 推荐使用 3.x 或以上
  3. 在 Dependencies 中添加如下模块:
    • Spring Web(提供REST服务支持)
    • Spring Security(核心安全框架)
  4. 点击 "Generate" 下载压缩包并解压。

📁 项目目录结构简介

spring-security-demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.example.demosecurity/ 
│   │   │       ├── DemoSecurityApplication.java
│   │   │       ├── controller/
│   │   │       ├── config/
│   │   ├── resources/
│   │       └── application.properties

服务器部署方案-2

核心概念讲解:搞清楚几个基本术语

核心概念讲解:搞清楚几个基本术语

下面这几个专业术语虽然看起来很高大上,但其实并不难懂。

🔐 Authentication(认证)是什么?

就像进入小区要刷卡一样,用来确认你是谁的过程。

例子:当你输入用户名和密码登录微信,这就是“认证”。

Spring Security 提供了多种方式让你完成这个流程,包括:

  • 表单登录(最常见)
  • OAuth2(如用微信登录)
  • JWT(移动端常用)

🔒 Authorization(授权)又是什么?

类似于“门禁权限”——即使你进了小区,也未必能进物业办公室。

例如:管理员账号能看到所有用户信息,普通用户只能看自己的。这种权限划分就是授权做的事情。

Spring Security 支持对 URL、方法甚至字段级别进行权限控制。

🛡️ Filter(过滤器链)是怎么运作的?

你可以把 Spring Security 想象成一个关卡重重的安检门,每个请求都要过几道检查,比如是否登录、是否有权限等。

整个过程由多个Filter组成,它们按照顺序对请求做不同类型的校验。

👉 我们会在实战部分详细体验它是怎么配置的。


实战项目:动手搭建一个带登录功能的简易API系统

实战项目:动手搭建一个带登录功能的简易API系统

接下来我们要实现一个简单的 REST API 项目,包含两个接口:

路径 功能
/hello 公开接口,任何人都能访问
/api/user 只有登录用户才能访问

第一步:启动默认安全机制(默认用户名密码)

Spring Security 默认会启用一个临时账户来保护你的网站。

修改 application.properties

打开文件路径:resources/application.properties

新增一行:

spring.security.user.name=admin
spring.security.user.password=123456

运行项目,访问任何页面都会跳转到登录页(或弹出 Basic Auth 登录框)。

📌 注意:这只是演示用途,实际应结合数据库使用真实用户信息。


第二步:添加控制器

新建控制器类文件 HelloController.java 存放在 controller 包下:

package com.example.demosecurity.controller;

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

@RestController
public class HelloController {

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

    @GetMapping("/api/user")
    public String userOnly() {
        return "这是只有登录用户才能看到的信息!";
    }
}

重启项目,然后尝试访问 /api/user/hello

  • 访问 /hello → 成功显示
  • 访问 /api/user → 出现登录提示

✅ 到这里为止,Spring Security 已经开始生效!


第三步:自定义登录逻辑(关闭默认登录)

现在我们将完全接管登录流程。

创建配置类

新建类文件 SecurityConfig.java

package com.example.demosecurity.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(ROLE_USER),admin(ROLE_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(auth -> auth
                .requestMatchers("/hello").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin(login -> login
                .defaultSuccessUrl("/api/user", true)
            );


![缓存策略对比-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025062911/72d1b1de-34d2-4e3e-acfd-8a196ed9aa39.jpg)


        return http.build();
    }
}

📝 解释关键点:

  • InMemoryUserDetailsManager 把用户存储在内存里(仅用于教学示例)
  • authorizeHttpRequests() 控制不同URL的访问权限
  • .formLogin() 自动提供一个登录页面

🎯 测试效果:

  1. 访问任意路径,先跳转到登录页(默认路径为 /login
  2. 使用 user/123456admin/admin123 登录试试看
  3. 登录成功后会被重定向到 /api/user

第四步:按角色控制权限

我们来升级一下我们的规则:

  • /api/admin 只允许 ROLE_ADMIN 角色访问

更新 HelloController.java 添加新接口:

@GetMapping("/api/admin")
public String adminOnly() {
    return "这里是后台管理员专属页面";
}

接着修改配置类 SecurityConfig.java 中的授权规则:

.authorizeHttpRequests(auth -> auth
    .requestMatchers("/hello").permitAll()
    .requestMatchers("/api/admin").hasRole("ADMIN") // 限制 ADMIN 角色访问
    .anyRequest().authenticated()
)

📌 注意:.hasRole("ADMIN") 内部会自动加上前缀 “ROLE_”,所以不用自己加。

现在尝试用用户 user 登录后访问 /api/admin,你应该会得到 403 错误(Forbidden)。


常见问题解答(FAQ)

Q:为什么我登录一直失败?
A:请检查 withDefaultPasswordEncoder() 的密码是否正确,或者是否启用了 CSRF(后面我们会教你怎么关闭它)。

Q:如何去掉 Spring Security 提供的默认登录页?
A:可以在配置中调用 .httpBasic().disable(); formLogin().disable() 等方法禁用默认行为,再手动实现登录逻辑。

Q:如果我希望记住用户登录状态怎么办?
A:Spring Security 默认使用 session 来保持登录状态。如果是前后端分离项目,考虑使用 JWT 方式替代。

Q:密码一定要明文写吗?
A:不是!目前只是为了方便演示。正式环境必须加密存储密码,通常使用 BCryptEncoder 加密算法。


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

恭喜你完成了 Spring Security 的第一个小项目!你已经掌握了入门知识,但这只是冰山一角:

⏭️ 继续学习方向建议:

  1. 连接数据库:把用户存在数据库而不是内存
  2. 整合JWT:适用于 App 或前后端分离的认证方案
  3. RBAC模型:角色+权限管理进阶
  4. 防止 CSRF/XSS:增强系统安全性
  5. 多因素认证(MFA):银行级安全认证实现

📚 学习资源推荐:


🎉 最后鼓励一句:

安全编程是每一个合格后端程序员必备的能力。今天的每一份代码实践,都会为你日后构建更复杂的系统打下扎实的基础。

继续加油吧,未来的全栈工程师!

评论 0

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