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

出类拔萃
2025-06-29 13:33
阅读 642

开篇:什么是Spring Security?它有什么用?

开篇:什么是Spring Security?它有什么用?

你可能听说过“安全”这个词在软件开发中经常出现。比如网站登录、权限控制这些功能,其实就是程序的安全机制在起作用。

Spring Security 就是 Java 开发中最常用的一个安全框架,它能帮助我们:

  • 实现用户登录功能(比如用户名密码验证)
  • 控制页面访问权限(比如只有管理员才能看到某些页面)
  • 防止常见的攻击(如跨站请求伪造 CSRF)

我们可以把它想象成一个“保安系统”,用来保护我们的 Web 应用不被非法访问。

今天我们就来一步步用 Spring Security 搭建一个简单的安全认证系统!


环境准备:搭建开发环境

环境准备:搭建开发环境

所需工具

工具 说明
JDK 17+ Java 开发环境
Maven 项目依赖管理工具
IntelliJ IDEA(或其他IDE) 推荐使用,也可以用 VSCode + Java 插件
Spring Boot 3.x Spring Security 的运行环境

✅ 建议使用 Spring Initializr 快速创建项目
官网地址:https://start.spring.io/

创建 Spring Boot 项目步骤:

  1. 打开上面的链接
  2. 填写如下信息:
    • Project: Maven
    • Language: Java
    • Spring Boot Version: 最新稳定版(如 3.2.x)
    • Dependencies:
      • Spring Web
      • Spring Security
      • Thymeleaf(用于前端展示)
  3. 点击 Generate 下载压缩包并解压
  4. 导入项目到 IDE 中,等待 Maven 自动下载依赖

完成后你的项目结构大致如下:

src
├── main
│   ├── java
│   │   └── com.example.demo
│   │       ├── DemoApplication.java
│   │       └── config/(后续添加配置类)
│   ├── resources
│       ├── static/
│       ├── templates/
│       └── application.properties

核心概念:认识几个重要概念

核心概念:认识几个重要概念

为了更轻松地理解 Spring Security,先了解这几个关键词。

1. 认证(Authentication)

认证就是确认你是谁的过程。比如用户输入用户名和密码进行登录,这一步就是在做“认证”。

2. 授权(Authorization)

授权是决定你能不能做什么事情。比如有些页面只有管理员可以访问,普通用户不能看,这就是“授权”的体现。

3. SecurityFilterChain

这是 Spring Security 中一个非常重要的组件,它就像一扇门,所有进入网站的请求都会经过它。你可以在这里设置哪些请求需要登录、哪些不需要。

4. UserDetailsService

这是 Spring Security 提供的一个接口,用于从数据库或内存中加载用户信息,用于登录验证。

5. BCryptPasswordEncoder

这是一个加密工具,用来安全地存储用户的密码,防止泄露。


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

我们将实现以下功能:

  • 访问首页 / 不需要登录
  • 访问 /admin 页面必须登录且具有 ADMIN 权限
  • 支持用户名密码登录

Step 1:编写基本网页模板

resources/templates 文件夹下新建两个 HTML 文件:

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h1>欢迎来到首页!</h1>
    <p><a href="/admin">前往后台管理页面</a></p>
    <p><a href="/login">登录</a></p>
</body>
</html>

admin.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>管理页</title>
</head>
<body>
    <h1>这里是管理员页面!</h1>
    <a href="/logout">退出登录</a>
</body>
</html>

Step 2:编写控制器(Controller)

DemoApplication.java 同级目录下新建 HomeController.java

package com.example.demo;

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

@Controller
public class HomeController {

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

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

现在启动项目,浏览器访问 http://localhost:8080,能看到主页内容。

不过目前还没加任何安全控制,所有人都能直接访问 /admin

接下来重点来了——我们要加入 Spring Security 的安全控制!

Step 3:配置安全策略(SecurityFilterChain)

在项目根包下新建包 config,然后添加文件 SecurityConfig.java

package com.example.demo.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.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
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("admin123")
                .roles("ADMIN")
                .build();

        return new InMemoryUserDetailsManager(user, admin);
    }

    // 安全规则配置
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((requests) -> requests
                        .requestMatchers("/", "/login").permitAll()
                        .requestMatchers("/admin").hasRole("ADMIN")
                        .anyRequest().authenticated()
                )
                .formLogin((form) -> form
                        .loginPage("/login") // 我们没有这个页面,可以用默认的
                        .permitAll()
                )
                .logout((logout) -> logout.permitAll());

        return http.build();
    }
}

这段代码做了几件事:

  1. 在内存中定义了两个用户:user 和 admin,分别有 USER 和 ADMIN 角色。
  2. 配置了访问权限:
    • //login 不需要登录就可以访问。
    • /admin 必须有 ADMIN 角色才能访问。
    • 其他路径都需要登录。
  3. 开启了表单登录和注销功能。

Step 4:测试登录效果

重启项目后:

  • 访问 http://localhost:8080/admin
  • 系统会跳转到登录界面(Spring Security 默认提供了),输入用户名 admin 和密码 admin123
  • 登录成功后,就可以看到管理员页面

💡 如果你想自定义登录页面(比如自己写个 login.html),只需要把 /login 路径指向自己的页面即可。


常见问题解答

❓为什么我输入正确的用户名密码还会提示登录失败?

可能原因:

  • 密码加密方式错误。确保调用了 .withDefaultPasswordEncoder() 方法。
  • 使用了 .hasAuthority() 检查的是权限名而不是角色名(角色名前面自动加 ROLE_)。

❓我想让所有人访问 /about 页面怎么办?

修改配置中的 .requestMatchers(...) 即可:

.requestMatchers("/about").permitAll()

❓如何让访问 /api/** 的请求都走无状态 JWT 验证?

这个属于进阶内容,我们以后再讲。目前建议先掌握基于 session 的安全机制。

❓能否把用户存在数据库里?

当然可以!我们上面用的是内存中的用户。之后可以通过集成数据库,比如 MySQL,来支持用户持久化。


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

恭喜你完成了第一个安全认证系统的搭建!下一步建议继续学习:

进阶知识点清单:

  1. 【必学】自定义登录页面
  2. 【必学】基于数据库的用户认证
  3. 【选学】使用 JWT 替换 Session 实现无状态认证
  4. 【拓展】方法级别的权限控制(@PreAuthorize 注解)
  5. 【拓展】CSRF、XSS 等安全防护机制
  6. 【实战】整合 OAuth2 第三方登录(如微信、GitHub)

总结

本教程带你一步步搭建了一个简单的 Spring Security 安全系统。从零开始,完成了以下目标:

  • 理解了 Spring Security 的基本概念
  • 搭建了开发环境
  • 实现了基础登录与权限控制
  • 回答了新手常见问题
  • 明确了下一步的学习方向

Spring Security 虽然一开始看起来复杂,但只要你坚持实践,很快就会上手。如果你觉得这篇文章对你有帮助,不妨收藏起来,作为学习安全认证的第一站!

继续加油,未来的安全高手就是你!🚀

评论 0

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