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

奇妙创造者
2025-06-20 14:33
阅读 475

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

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

对于刚接触后端开发的新手朋友来说,Spring Security 可能听起来有点陌生。别担心,它其实是一个非常强大的工具,用来帮助我们在 Java 应用中实现用户登录、权限控制和访问保护等功能。

想象一下你做了一个博客网站,你想让只有注册了的用户才能发文章,而访客只能看不能发;或者你想给管理员一个专门的后台页面,其他人访问不了。这些功能就是 Spring Security 帮我们实现的。

换句话说:

Spring Security 就是你的 Java Web 应用的“保安”或“门卫”,负责识别谁在访问,判断他们能不能进某个页面或执行某些操作。

这个框架虽然功能强大,但入门并不难。这篇文章会带你从零开始,一步一步地搭建一个简单但完整的安全认证系统。


环境准备:你需要准备什么?

环境准备:你需要准备什么?

要使用 Spring Security,我们需要先准备好基本的开发环境。这里我们以最简单的 Spring Boot 项目为例,因为它可以自动帮我们集成 Spring Security。

1. 安装 JDK

确保你已经安装了 Java 开发工具包(JDK)。推荐使用 JDK 17 或以上版本,可以在官网下载安装:Oracle JDKOpenJDK

检查是否安装成功:

java -version

2. 安装 IntelliJ IDEA(推荐)

IntelliJ IDEA 是一款优秀的 Java IDE,社区版免费。可以从官网下载安装:https://www.jetbrains.com/idea/download/

也可以使用 Eclipse 或 VS Code,但推荐新手用 IDEA,因为它对 Spring 项目支持很好。

3. 创建 Spring Boot 项目

我们可以使用 Spring Initializr 来创建项目:

访问 https://start.spring.io/

选择以下配置:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 最新稳定版(如 3.0.x)
  • Group: com.example
  • Artifact: demo-security
  • Name: DemoSecurityApplication
  • Packaging: Jar
  • Java Version: 17

然后添加依赖项:

  • Spring Web
  • Spring Security

点击【Generate】下载压缩包并解压。

4. 导入项目到 IntelliJ IDEA

打开 IDEA → “File” → “New” → “Project from Existing Sources” → 找到解压后的项目文件夹 → 选择 Maven 项目 → 一步步导入即可。

完成后,你应该能看到如下结构:

src
├── main
│   ├── java
│   │   └── com.example.demosecurity
│   │       ├── DemoSecurityApplication.java
│   │       └── controller
│   │           └── HomeController.java (需要自己创建)
│   └── resources
│       └── application.properties
└── test

到这里,我们的开发环境就准备好了!


核心概念:你必须知道的几个关键词

核心概念:你必须知道的几个关键词

为了更好地理解 Spring Security 的工作原理,我们需要了解几个关键概念:

1. 用户认证(Authentication)

通俗解释:用户登录的过程就是认证。
也就是验证用户是不是他们声称的那个人。常见的做法是输入用户名和密码来完成认证。

2. 用户授权(Authorization)

通俗解释:确定已登录的用户能否执行某个操作。
比如:普通用户只能查看文章,不能发布;管理员可以修改和删除文章。

3. 登录页面(Login Page)

如果你没有自己写登录页,Spring Security 默认会提供一个简单的登录界面供你使用。

4. 安全配置类(Security Config)

这个类是我们用来告诉 Spring Security 如何进行安全设置的地方。比如哪些页面需要登录、登录后的跳转路径、允许哪些用户访问等。


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

接下来我们要做一个完整的安全认证流程,包括:

  • 添加主页、受限页面
  • 配置登录页面
  • 创建用户和角色
  • 设置不同权限的访问控制

第一步:创建控制器 HomeContoller.java

src/main/java/com/example/demosecurity/controller 目录下新建一个控制器类:

package com.example.demosecurity.controller;

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

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "index"; // 返回 templates 下的 index.html 文件
    }

    @GetMapping("/user")
    public String userPage() {
        return "user"; // 返回 templates 下的 user.html
    }

    @GetMapping("/admin")
    public String adminPage() {
        return "admin"; // 返回 templates 下的 admin.html
    }
}

第二步:创建 HTML 页面

由于我们用了 Thymeleaf 模板引擎(Spring Boot 默认自带),在 resources/templates/ 下创建页面:

index.html(主页)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>首页</title>
</head>
<body>
    <h1>欢迎来到首页</h1>
    <a href="/user">普通用户页面</a><br>
    <a href="/admin">管理员页面</a>
</body>
</html>

user.html(普通用户页面)

<h1>这是普通用户的专属页面</h1>

admin.html(管理员页面)

<h1>这是管理员页面</h1>

第三步:配置安全规则 SecurityConfig.java

新建一个类 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.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public UserDetailsService userDetailsService() {
        var manager = new InMemoryUserDetailsManager();
        
        // 添加一个用户,用户名 user,密码 user123,角色 USER
        manager.createUser(User.withUsername("user")
                .password("{noop}user123")  // {noop} 表示明文存储
                .roles("USER")
                .build());


![系统架构设计图-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025062014/525e0da2-0fcf-4d50-9e3f-e59fe15f0e78.jpg)


        // 添加一个管理员,用户名 admin,密码 admin123,角色 ADMIN
        manager.createUser(User.withUsername("admin")
                .password("{noop}admin123")
                .roles("ADMIN")
                .build());

        return manager;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/").permitAll()
                .requestMatchers("/user").hasRole("USER")
                .requestMatchers("/admin").hasRole("ADMIN")
                .anyRequest().authenticated())
            .formLogin(form -> form
                .loginPage("/login")  // 自定义登录页面,我们现在还没做,所以暂时注释掉
                .permitAll())
            .logout(logout -> logout.permitAll());

        return http.build();
    }
}

目前我们先不自定义登录页面,这样 Spring 会自动给我们一个默认的登录页。

第四步:测试运行

启动项目,访问:

http://localhost:8080/

点击进入 /user 页面时,会自动跳转到登录页:

http://localhost:8080/login

这时你可以尝试输入:

  • 用户名:user
  • 密码:user123

或者:

  • 用户名:admin
  • 密码:admin123

看看是否可以分别访问 /user/admin 页面。

现在你就完成了第一个安全认证系统的基本搭建!


常见问题解答

Q1:为什么我输入正确的用户名和密码也登录不了?

可能原因:

  • 密码没加 {noop},导致 Spring 认为你是用加密存储方式,但实际上你用了明文。
  • 忘记启用 .formLogin() 功能。
  • 浏览器缓存了旧的登录状态,建议清除缓存或换浏览器试试。

✅ 解决方案: 确认你的用户配置里密码前面有 {noop}

.password("{noop}user123")

Q2:我想用数据库里的用户登录怎么办?

目前我们用的是内存中的用户(InMemoryUserDetailsManager),如果要用数据库,后面可以接入 Spring Data JPA + 数据库,再自定义 UserDetails 服务。我们会在后续教程中讲解。

Q3:登录页报错“Bad credentials”是什么意思?

意味着用户名或密码错误。请仔细核对你在代码中创建的用户信息,并确认输入无误。


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

恭喜你完成了 Spring Security 的第一步!下面是给你的一些建议,帮助你继续深入学习:

✅ 掌握更多安全配置技巧

  • 自定义登录页面
  • 登录成功/失败回调处理
  • 多种角色权限控制策略
  • 限制同时在线人数

✅ 接入真实数据库

  • 使用 MySQL / PostgreSQL 存储用户信息
  • 使用 Spring Data JPA 查询用户信息
  • 加密存储密码(如 BCryptPasswordEncoder)

✅ 进阶内容(按兴趣选择)

  • JWT 认证与 OAuth2
  • 方法级别的权限控制(@PreAuthorize)
  • 防止跨站请求伪造(CSRF)
  • 安全日志记录和审计功能

总结回顾

在这篇文章中,我们一起完成了以下几个重要步骤:

  1. 介绍了什么是 Spring Security 及其作用;
  2. 准备了开发环境,创建了 Spring Boot 项目;
  3. 理解了认证、授权等核心概念;
  4. 实战搭建了一个具有登录、权限控制的安全应用;
  5. 解答了一些初学者常见问题;
  6. 提出了进一步学习的方向建议。

后续计划建议

如果你觉得收获不错,可以尝试:

  • 把今天的内容重复练习一次,加深记忆
  • 尝试加入“退出登录”按钮
  • 给登录页面加上样式,提升用户体验
  • 尝试接入真实的 MySQL 数据库管理用户

下一篇文章我会带你一步步接入数据库,实现更贴近实战的安全系统。敬请期待 🚀


📌 提示:所有源码都可以在 GitHub 上找到(假设有)
如需获取完整源码或配套资源,请关注本公众号 / 个人博客。

评论 0

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