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

程序员Dev
2025-06-15 22:37
阅读 514

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

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

如果你刚开始学习Java后端开发,可能会遇到一个问题:我写了一个网页应用,但如何保护它的安全性呢?比如不让陌生人访问某些页面,或者区分不同用户的权限?

这时候,我们就要用到一个非常强大的工具 —— Spring Security

一句话概括:

Spring Security 是一个用于保护 Java Web 应用的安全框架,它可以控制用户能不能登录、能不能访问某个页面、有没有操作权限等。

简单来说,它就像你家的大门和保安系统。没有它,别人可以直接走进你的房子;有了它,你可以设置只有持有钥匙(比如用户名密码)的人才能进门,并且根据他们的身份决定他们能去哪些房间。

在本篇文章中,我们将从零开始一步步搭建一个简单的带有用户登录功能的 Spring Boot 项目,并使用 Spring Security 来实现基础的安全控制。


环境准备:你需要准备好这些工具

环境准备:你需要准备好这些工具

要完成本次实践,你需要以下几个开发环境和工具:

1. Java 开发环境

  • JDK版本:至少 1.8
  • 推荐使用 OpenJDK 或 Oracle JDK

2. IDE(集成开发环境)

  • 推荐使用 IntelliJ IDEA(社区版即可)Eclipse

3. Maven

  • 构建项目依赖管理工具,IDE 中一般内置了,如果没有需要单独安装

4. 浏览器

  • Chrome 或 Edge(方便调试接口)

5. Postman(可选)

  • 调试 API 的工具,也可以用浏览器发送请求

第一步:创建一个 Spring Boot 项目

你可以通过以下两种方式创建项目:

方法一:使用 Spring Initializr

  • 打开网站,填写如下信息:
    • Project: Maven
    • Language: Java
    • Spring Boot Version: 可选最新稳定版本,如 3.x
    • Group: com.example
    • Artifact: demo-security
    • Name: DemoSecurityApplication
    • Dependencies:
      • Spring Web
      • Spring Security

微服务架构示意图-1

点击 “Generate” 下载压缩包,解压后导入 IDEA 即可。

方法二:使用 IntelliJ IDEA 创建

  • 在 IDEA 中选择 "New Project"
  • 选择 Spring Initializr
  • 填写基本信息
  • 选择依赖:Spring Web + Spring Security

核心概念:Spring Security 的几个关键知识点

为了让你更好地理解后面代码的作用,先来认识几个核心概念:

概念 通俗解释
认证(Authentication) 验证用户是不是他所说的那个人(比如输入用户名密码)
授权(Authorization) 决定用户能不能执行某个操作(比如管理员可以删除数据,普通用户不行)
用户详情服务(UserDetailsService) 提供用户的信息,比如账号、密码、权限等
安全配置类(SecurityConfig) 我们自己写的类,用来定义安全规则

接下来我们会逐一了解它们,并结合代码进行演示。


实战项目:跟着教程一步步搭建安全认证系统

我们将完成以下目标:

  1. 创建一个登录页面
  2. 实现用户名/密码登录
  3. 设置两个角色:USER 和 ADMIN
  4. 限制 /user 页面只能由 USER 访问,/admin 页面只能由 ADMIN 访问

第一步:添加依赖

打开 pom.xml 文件,确认已经包含以下两个依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

如果没有,请手动添加。


第二步:编写登录页面(可选,如果不想写页面可以用 Postman 模拟登录)

我们可以先写一个简单的登录页面 login.html,放在 src/main/resources/templates/ 目录下(注意需要引入 Thymeleaf 模板引擎)。

添加 Thymeleaf 支持

pom.xml 中加入:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

然后新建 login.html 文件:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <h2>请登录</h2>
    <form action="/login" method="post">
        用户名:<input type="text" name="username"><br>
        密码:&nbsp;&nbsp;<input type="password" name="password"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

接着,我们写一个控制器来显示登录页:

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

@Controller
public class AuthController {

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

}

第三步:自定义用户信息与角色

为了让 Spring Security 知道有哪些用户,我们需要定义用户和他们的权限。

最简单的方式是直接在 application.properties 文件中配置内存中的用户:

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

spring.security.user.name=user
spring.security.user.password=123456
spring.security.user.roles=USER

这样我们就有了两个用户:

用户名 密码 角色
admin 123456 ADMIN
user 123456 USER

第四步:配置安全规则

现在我们要告诉 Spring Security:哪些页面需要验证,哪些页面必须有特定角色才能访问。

我们新建一个配置类 SecurityConfig.java

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.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    // 配置用户及角色
    @Bean
    public UserDetailsService userDetailsService(PasswordEncoder encoder) {
        UserDetails user = User.withUsername("user")
                .password(encoder.encode("123456"))
                .roles("USER")
                .build();

        UserDetails admin = User.withUsername("admin")
                .password(encoder.encode("123456"))
                .roles("ADMIN")
                .build();

        return new InMemoryUserDetailsManager(user, admin);
    }

    // 配置加密方式(推荐使用 BCrypt)
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    // 配置安全规则
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/").permitAll()       // 主页无需登录
                .requestMatchers("/user/**").hasRole("USER")   // /user 开头的页面需要 USER 角色
                .requestMatchers("/admin/**").hasRole("ADMIN") // /admin 开头的页面需要 ADMIN 角色
                .anyRequest().authenticated())          // 其他请求都需要登录
            )
            .formLogin(form -> form
                .loginPage("/login")                    // 自定义登录页路径
                .defaultSuccessUrl("/home")             // 登录成功后的跳转地址
                .permitAll()
            )
            .logout(logout -> logout.permitAll());

        return http.build();
    }
}

这段代码看起来有点长,我们来逐个解释一下它的含义:

  • userDetailsService:告诉 Spring Security 有哪些用户存在
  • passwordEncoder:设置密码加密方式(BCrypt 更加安全)
  • securityFilterChain:定义 URL 的访问规则

第五步:创建受保护的页面

我们再创建几个测试页面来验证我们的权限设置。

创建一个新的 Controller 类:

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

@Controller
public class PageController {

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

    @GetMapping("/user/home")
    public String userHome() {
        return "这是普通用户页面";
    }

    @GetMapping("/admin/dashboard")
    public String adminDashboard() {
        return "这是管理员页面";
    }

    @GetMapping("/home")
    public String afterLogin() {
        return "登录成功";
    }

}

第六步:运行并测试

启动项目后,在浏览器访问:

  • / → 主页(所有人都能访问)
  • /user/home → 必须登录为 USER 用户才能访问
  • /admin/dashboard → 必须登录为 ADMIN 用户才能访问
  • /login → 登录页面

尝试输入不同的用户名和密码看看能否访问对应页面。


常见问题解答

Q1:为什么不能访问 /user/home 页面?

  • 可能原因:你没有以具有 USER 角色的用户登录
  • 解决方法:尝试使用用户名 user 密码 123456 登录后再访问

Q2:密码对为什么提示登录失败?

  • 检查是否正确设置了密码编码器 PasswordEncoder
  • 如果你是直接从数据库读取用户,可能没有使用正确的加密方式

Q3:无法访问自定义登录页面?

  • 确保控制器方法返回的视图名和 templates 文件夹下的 .html 文件名一致
  • 并检查是否引入了 Thymeleaf 依赖

Q4:忘记添加 spring-security 依赖怎么办?

  • 回到 pom.xml 中添加对应的 dependency 即可

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

恭喜你完成了第一个 Spring Security 项目的搭建!现在你知道了:

  • 如何创建一个安全的 Web 应用
  • 如何配置用户、角色和访问权限
  • 如何保护你的 URL

接下来推荐你继续学习:

  1. 数据库认证:使用 MySQL、PostgreSQL 连接数据库验证用户
  2. 记住我功能(Remember Me):让系统记住用户一段时间内不需要重新登录
  3. JWT 认证:适用于前后端分离架构的身份验证方式
  4. OAuth2 登录:接入微信、QQ、GitHub 等平台登录
  5. 权限注解:使用 @PreAuthorize@Secured 控制方法级别的权限

推荐资源:


总结

在这篇教程中,你亲手完成了以下事情:

✅ 创建了一个 Spring Boot 项目
✅ 引入了 Spring Security 依赖
✅ 配置了用户和角色
✅ 定义了 URL 安全规则
✅ 实现了登录和权限控制功能

这只是一个起点。Spring Security 功能强大、灵活,后续还有许多高级功能等着你去探索。

坚持动手、多做练习,你会发现安全编程并没有那么难,而且特别实用!


如有疑问,欢迎留言讨论或查阅更多资料。祝你学习愉快 😊

评论 0

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