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

Token不够用
2025-06-29 20:19
阅读 406

一、开篇:什么是Spring Security?它用来做什么?

一、开篇:什么是Spring Security?它用来做什么?

你有没有遇到过这样的场景:

  • 你开发了一个博客网站,用户可以发布文章;
  • 你希望只有注册并登录的用户才能发表内容;
  • 不想让别人随意访问你的后台管理系统。

这个时候,你就需要一个“身份验证和权限控制”的功能。而 Spring Security 就是帮你实现这个功能的强大工具!

📌 Spring Security 是什么?
它是一个基于 Java 的安全管理框架,专门用于在 Spring 项目中进行:

  1. 身份认证(谁在用系统)
  2. 权限控制(能干什么)

简单来说,它的作用就像小区门口的保安。他会检查你是谁,并决定你能不能进哪个楼栋。

今天我们不讲太复杂的东西,而是从零开始,手把手教你如何用 Spring Security 搭建一个简单的安全认证系统!


二、环境准备:搭建开发环境

二、环境准备:搭建开发环境

为了顺利学习 Spring Security,你需要先准备好以下几个开发环境:

1. 开发工具(IDE)

推荐使用:

  • IntelliJ IDEA(社区版或Ultimate版)
  • Eclipse(也可以)

下载地址:

2. JDK 安装

确保已安装 Java Development Kit(JDK),建议版本为 JDK 17 或更高

👉 查看是否安装成功:

java -version

如果输出版本号,说明已安装。

3. 创建 Spring Boot 项目

我们使用 Spring Initializr 快速生成一个 Spring Boot 项目:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 建议使用最新稳定版(如 3.x)
  • Group: com.example
  • Artifact: securitydemo
  • Dependencies:
    • Spring Web
    • Spring Security
    • Thymeleaf (可选,用于前端展示)

然后点击 “Generate” 下载项目压缩包,解压后导入 IDE 中。


三、核心概念:通俗理解几个关键词

三、核心概念:通俗理解几个关键词

在开始写代码前,我们需要了解几个基本术语:

1. 认证(Authentication)

这是确认用户身份的过程,比如输入用户名和密码。

✅ 示例:

  • 输入账号密码登录网站
  • 手机验证码登录App

2. 授权(Authorization)

这是确定用户是否有权访问某个资源,比如查看文章、发布内容等。

✅ 示例:

  • 普通用户只能查看文章
  • 管理员可以删除评论

3. 用户(User)

即系统的使用者,通常存储在数据库中,包含用户名、密码、角色等信息。

4. 角色(Role)

角色决定了用户有哪些权限,比如:

  • ROLE_USER:普通用户
  • ROLE_ADMIN:管理员

5. 过滤器链(Filter Chain)

Spring Security 会用多个“安检门”来拦截请求,对请求进行认证授权检查。


四、实战项目:一步步搭建安全认证系统

四、实战项目:一步步搭建安全认证系统

我们将完成以下步骤:

  1. 实现一个简单的登录页面
  2. 配置 Spring Security 的安全策略
  3. 根据不同角色控制页面访问权限

第一步:创建首页控制器

我们在 src/main/java/com/example/securitydemo/controller 目录下新建一个类 HomeController.java

package com.example.securitydemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "home";
    }
}

第二步:创建 Thymeleaf 页面(模板)

src/main/resources/templates 下新建 home.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h1 th:text="${msg}">欢迎光临!</h1>
    <p><a href="/login">登录</a></p>
</body>
</html>

第三步:添加登录页(Spring Security 会自动提供)

我们现在先不用自己写登录页,因为 Spring Security 默认会帮我们生成一个 /login 页面。

第四步:配置 Spring Security

打开 SecurityConfig.java(如果没有,创建一个新的配置类):

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("123456")
                .roles("ADMIN")
                .build();
        return new InMemoryUserDetailsManager(user, admin);
    }

    // 安全策略配置
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> {
                auth
                    .requestMatchers("/").permitAll()
                    .requestMatchers("/admin/**").hasRole("ADMIN") // /admin/... 只有ADMIN能访问
                    .anyRequest().authenticated(); // 其他路径必须登录
            })
            .formLogin(form -> form.loginPage("/login")); // 使用默认登录页
        return http.build();
    }
}

上面代码的作用如下:

  • 创建了两个用户:user 和 admin
  • / 主页放行(所有人都可以访问)
  • /admin/** 路径设置了权限要求(必须拥有 ADMIN 角色)
  • 启用了表单登录功能(Spring Security 自动生成登录页面)

第五步:测试访问权限

启动项目后访问:

🎉 到此为止,一个最基础的安全系统就完成了!


五、常见问题解答(FAQ)

Q1:Spring Security 是不是只能做登录?

不是哦!Spring Security 功能非常强大,还能:

  • 处理第三方登录(微信、QQ等)
  • 实现权限细粒度管理(比如某用户只能编辑自己的文章)
  • 防止 CSRF 攻击、SQL注入等安全漏洞

Q2:为什么登录成功后还会跳回登录页?

可能是两种情况:

  1. 密码错误 → 请检查用户名和密码是否正确
  2. 没有访问权限 → 虽然登录成功,但没有目标路径的权限,会被拒绝

Q3:我想自定义登录页面怎么做?

你可以通过 .loginPage("/my-login") 设置自定义登录页,并编写对应的控制器和 HTML 页面。

例如:

.formLogin(form -> form
        .loginPage("/my-login")
        .permitAll())

然后创建 /my-login 页面并配置控制器返回该视图即可。


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

数据库设计模型-1

你已经完成了 Spring Security 的入门,下面是一些提升建议:

🔸 学习方向1:进阶认证方式

  • 数据库存储用户信息(结合 JPA + MySQL)
  • 第三方登录(OAuth2 / SSO)
  • JWT + Token 登录机制

🔸 学习方向2:权限控制进阶

  • 方法级别的权限控制(@PreAuthorize)
  • 自定义权限判断逻辑
  • RBAC(基于角色的权限模型)

🔸 推荐学习资料


总结

在这篇文章中,我们一起完成了:

✅ 搭建 Spring Boot 环境
✅ 创建一个带有登录功能的 Spring Security 应用
✅ 配置不同用户的访问权限
✅ 解决常见疑问与误区

虽然只是入门,但已经具备了开发中小型应用所需的安全能力。接下来只要坚持实践,就能慢慢掌握更高级的应用技巧!

如果你觉得这篇文章对你有帮助,请记得点赞+关注,我们下次继续一起进步 😎

评论 0

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