Spring Security基础:快速搭建安全认证系统(新手友好版)

不想写日报
2025-06-24 20:04
阅读 716

开篇:什么是Spring Security?

开篇:什么是Spring Security?

在写代码的时候,如果你做过一些网站或者服务端项目,肯定遇到过这样的问题:“怎么让只有登录的人才能访问某些功能?”
这时候就需要一个安全框架来帮忙了。Spring Security 就是这样一个用来保护你的应用的安全工具箱

它可以帮助我们:

  • 让用户登录
  • 控制哪些页面谁可以看、谁不能看
  • 管理用户的权限
  • 防止恶意用户做一些不该做的事

简单说:Spring Security 是你 Java 应用的“门卫”,它可以决定哪些人能进来,哪些人不行,进来了之后能干什么。


第一步:环境准备

第一步:环境准备

1. 准备你的开发环境

要使用 Spring Security,需要先准备好以下工具:

✅ 已安装:

  • JDK 17 或以上
  • IDE(推荐 IntelliJ IDEA / Eclipse / VS Code + Java 插件)
  • Maven(构建项目用的工具)

如果没有这些,建议去下面这些地方下载安装:

软件 下载地址
JDK 17+ https://adoptium.net/
IntelliJ IDEA https://www.jetbrains.com/idea/
Maven https://maven.apache.org/download.cgi

安装好后,在终端输入:

java -version
mvn -v

如果都能看到版本信息就说明装好了!


第二步:创建 Spring Boot 项目

第二步:创建 Spring Boot 项目

最简单的做法是使用官网提供的 Spring Initializr 来生成一个项目。

步骤如下:

  1. 打开 https://start.spring.io/
  2. 选择或填写:
    • Project: Maven
    • Language: Java
    • Spring Boot Version: 最新稳定版(比如 3.x)
    • Group: com.example
    • Artifact: springsecuritydemo
    • Name: springsecuritydemo
  3. 点击 "Add Dependencies",加入两个依赖:
    • Spring Web
    • Spring Security
  4. 点击下方 "Generate" 按钮下载压缩包,解压到本地

打开 IDE,导入该项目即可。


第三步:了解几个关键概念

在开始动手之前,先理解几个核心术语:


1. 用户认证(Authentication)

👉 它就是判断一个人是不是他所说的那个人的过程。

例子:

  • 你输入用户名和密码 → 系统验证是否正确 → 成功登录 → “你是张三”

2. 授权(Authorization)

👉 在确定你是谁之后,再看看你能干啥。

例子:

  • 如果你是管理员,你可以删除数据;
  • 如果你是普通用户,只能查看; 这一步就是授权。

3. 过滤器链(Filter Chain)

👉 Spring Security 使用一系列过滤器来拦截每一个请求,决定是否允许继续执行。

想象一下:

  • 所有请求都要经过一连串的检查关卡(例如登录状态、权限、跨站攻击等等)。
  • Spring Security 把每个关卡封装成一个 Filter,形成一条“关卡链”。

4. 登录表单 vs 无界面登录(如 API)

👉 有时候你需要提供登录页,有时候只需要处理 API 请求(比如手机 App 调接口),Spring Security 都支持。


5. 内存用户 vs 数据库用户

我们一开始会用内存存储用户信息(测试方便),后面可以切换为数据库方式(真实环境常用)。


第四步:实战项目 —— 构建一个简易登录认证系统

我们将搭建一个只有两个页面的小项目:

  • /hello:任何人都可以看到
  • /admin:必须登录且角色是 admin 才能看到

Step 1:添加一个控制器类

路径:src/main/java/com/example/springsecuritydemo/controller/HomeController.java

内容如下:

package com.example.springsecuritydemo.controller;

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

@RestController
public class HomeController {

    @GetMapping("/hello")
    public String hello() {
        return "你好,游客也能看到哦!";
    }

    @GetMapping("/admin")
    public String admin() {
        return "欢迎管理员!";
    }
}

现在运行项目(点击 main() 方法运行),访问:

  • http://localhost:8080/hello → 可以直接看
  • http://localhost:8080/admin → 浏览器跳转到了登录页(因为未配置安全策略时默认开启了基本登录)

Step 2:添加 Spring Security 配置类

新建文件:SecurityConfig.java

路径:src/main/java/com/example/springsecuritydemo/config/SecurityConfig.java

内容如下:

package com.example.springsecuritydemo.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.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    // 配置用户名和密码,并设置角色
    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("123456")
                .roles("USER")
                .build();


![服务器部署方案-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025062420/ef4cfbb0-e00b-48eb-b77a-176cb48518c0.jpg)


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

        return new InMemoryUserDetailsManager(user, admin);
    }

    // 配置访问控制逻辑
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/hello").permitAll()  // 所有人都可以访问
                .requestMatchers("/admin").hasRole("ADMIN") // 只有 ADMIN 角色才能访问
                .anyRequest().authenticated())  // 剩下的所有请求都需要登录
            .formLogin(login -> login.permitAll())  // 启用默认登录表单
            .logout(logout -> logout.permitAll());  // 允许注销

        return http.build();
    }
}

⚠️ 注意:

  • 我们用了 .withDefaultPasswordEncoder() 简化加密过程(生产环境不要这样)
  • 创建了两个用户:普通用户 user 和管理员 admin
  • /hello 不需要登录,所有人都能访问
  • /admin 必须是拥有 ADMIN 角色的用户才能访问

Step 3:运行测试

启动项目后尝试以下操作:

✅ 测试点 1:访问 /hello
→ 不需要登录就能看到内容。

✅ 测试点 2:访问 /admin
→ 弹出登录页面,用户名填 admin,密码 123456
→ 成功后显示 “欢迎管理员!”

✅ 测试点 3:用用户名 user 登录
→ 登录成功但无法访问 /admin 页面(返回 403)


常见问题解答(FAQ)

💬 问:为什么我输入了正确的账号密码,却一直提示登录失败?

答:请确认你输入的是正确的用户名和密码(我们设定的是 admin/123456)。另外,密码没有使用加密函数(因为我们用了 .withDefaultPasswordEncoder(),所以必须明文输入 123456)


💬 问:我没有看到登录页面,而是出现了 Basic Auth 的弹窗?

答:可能你在配置中没有启用 formLogin,请检查你的 SecurityConfig.java 文件,确保包含下面这一句:

.formLogin(login -> login.permitAll())

💬 问:能不能不弹出登录页,直接返回 JSON 错误信息?

答:可以!后续我们会学到如何适配前后端分离项目的 RESTful 风格登录方案,比如配合 JWT 返回 token。


💬 问:我在配置里写了 permitAll,为什么还是要求登录?

答:可能是匹配路径有问题。比如:

.requestMatchers("/hello/**").permitAll()

实际访问 /hello/abc 可以通过;但如果写成了:

.requestMatchers("/hello").permitAll()

/hello/xxx 可能还是会要求登录。建议初学者使用更通用的通配符,例如 /hello/**


💬 问:我设置了多个角色,但好像只认第一个?

答:确保角色名称不要拼错,且使用 .roles(...) 而不是 .authorities(...)。两者区别是:roles 会自动加上前缀 ROLE_,而 authorities 则不会。


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

恭喜你已经完成了一个最基本的 Spring Security 登录认证系统!

接下来你可以沿着这几个方向继续深入学习:

🚀 方向 1:数据库认证

  • 当前只是模拟用户存在内存中,真正的应用通常从数据库加载用户
  • 学习如何集成 MySQL + JPA + Spring Data + 动态查询用户信息

🔐 方向 2:密码加密实战

  • 目前我们用了明文密码 .withDefaultPasswordEncoder(),这是不安全的
  • 推荐使用 BCryptPasswordEncoder 并结合数据库做持久化管理

💻 方向 3:整合 JWT 实现无状态登录

  • 对于前后端分离项目(Vue、React、小程序等),更适合使用 JWT Token 登录
  • 学习如何生成 token、解析 token、校验 token

🌐 方向 4:实现 OAuth2 登录

  • 让用户用微信、QQ、GitHub 登录你的系统
  • 适合社交平台接入与 SSO 单点登录场景

总结

在这篇文章中,我们完成了以下几个目标:

✅ 理解了 Spring Security 的作用
✅ 搭建了开发环境并创建了一个简单项目
✅ 实现了基于内存的登录和权限控制
✅ 解决了一些常见问题
✅ 给出了下一步的学习路线

别忘了实践是掌握 Spring Security 的关键,多敲一遍配置代码,比看十遍教程都更有帮助!

如果你喜欢这种通俗易懂的教学风格,记得关注我,我会持续带来更多实用又接地气的编程教程 😊


📌 文章总字数:约 2959 字
🎯 面向人群:零基础 Java 新手
💡 教学理念:少讲理论,多上代码,轻松入门

评论 0

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