Spring Security基础:快速搭建安全认证系统(零基础教程)

罗雨萱
2025-06-30 02:28
阅读 239

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

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

大家好!你是不是刚开始学习Java后端开发?有没有听过一个叫做 Spring Security 的技术?它是 Java 领域最流行的安全框架之一。

简单来说,Spring Security 就是一个用来保护你的网页、接口不被坏人随便访问的工具。比如你想做一个网站,只有登录后的用户才能访问某些页面或功能,这时候就需要用到 Spring Security 来帮你控制访问权限。

在这篇教程中,我会用最简单的语言带你从零开始,一步一步搭建一个拥有“登录功能”的Web应用。让你对Spring Security有一个初步但清晰的理解。


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

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

在开始写代码之前,我们需要准备好一些开发环境:

1. 安装 JDK

确保你安装了 Java Development Kit (JDK)。推荐版本:JDK 17 或更高。

下载地址:https://www.oracle.com/java/technologies/downloads/

验证是否安装成功:

java -version

2. 安装 IntelliJ IDEA(推荐)

推荐使用 IntelliJ IDEA 社区版,免费且功能强大。

3. 创建 Spring Boot 项目

你可以通过 Spring Initializr 在线生成项目结构。

选择如下配置:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 最新稳定版(如 3.x)
  • Dependencies:
    • Spring Web
    • Spring Security
    • Thymeleaf(用于展示页面)

点击 “Generate” 下载项目压缩包,解压后用 IDEA 打开即可。


三、核心概念:Spring Security 中的关键角色

在你正式动手之前,我们先了解几个Spring Security中的关键词,它们是构建安全系统的基石。

1. 用户(User)

就是访问你网站的人。你要判断他们是谁,能不能访问资源。

2. 身份认证(Authentication)

也就是“你是谁?”的过程。例如登录时输入用户名和密码进行验证。

3. 授权(Authorization)

是在确认你是谁之后,决定你能不能做某件事。比如管理员可以删除文章,普通用户不行。

4. 过滤器链(Filter Chain)

Spring Security 内部通过多个过滤器来处理请求,每个过滤器负责不同的安全检查任务。

5. 登录页面 & 登出操作

Spring Security 可以自动生成默认的登录页面,也可以自己定制。


四、实战项目:一步步搭建一个带登录功能的网站

我们将创建一个简单的网页应用,包含以下功能:

  • 访问 /hello 页面需要登录
  • 提供登录页面和登出功能

步骤 1:编写主程序入口

确保你的 DemoApplication.java 文件内容如下:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

步骤 2:添加控制器类

新建一个 HelloController.java 文件:

package com.example.demo.controller;

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

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "hello"; // 返回模板名称
    }

    @GetMapping("/login")
    public String loginPage() {
        return "login"; // 自定义登录页
    }
}

步骤 3:添加 Thymeleaf 页面

src/main/resources/templates 目录下新建两个HTML文件:

hello.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
<h1>Welcome! 你好呀 😄</h1>
<a href="/logout">登出</a>
</body>
</html>

login.html

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

步骤 4:配置安全策略

新建一个配置类 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 SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((requests) -> requests
                .requestMatchers("/hello").authenticated()
                .anyRequest().permitAll()
            )
            .formLogin((form) -> form
                .loginPage("/login")
                .permitAll()
            )
            .logout((logout) -> logout
                .permitAll()
            );

        return filterChain.build();
    }

    // 添加内存用户
    @Bean
    public InMemoryUserDetailsManager userDetailsManager() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();

        return new InMemoryUserDetailsManager(user);
    }
}

步骤 5:运行并测试

启动你的项目,访问:

  • http://localhost:8080/hello
    → 应该自动跳转到 /login

输入用户名:user,密码:password,点击登录后进入欢迎页面。

点击“登出”,可退出当前账号。

✅ 到这一步,你已经成功地用 Spring Security 构建了一个具有基本登录认证功能的小网站!


五、常见问题解答(FAQ)

Q1:为什么我的登录总是失败?

可能是以下原因:

  • 密码错误
  • 没有设置 .withDefaultPasswordEncoder() 方法
  • 没有启用 CSRF(虽然本例已默认开启)

建议:确保你正确设置了用户信息,并开启了密码编码器。

Q2:可以不用登录页面自己写吗?

当然可以!只需要加上 .loginPage("/your-login-page") 并提供对应的 HTML 页面即可。

Q3:怎么添加多个用户?

userDetailsManager() 方法中继续使用 User.withDefaultPasswordEncoder() 创建新用户即可,例如:

UserDetails admin = User.withDefaultPasswordEncoder()
    .username("admin")
    .password("123456")
    .roles("ADMIN")
    .build();
return new InMemoryUserDetailsManager(user, admin);

Q4:不想每次都要登录怎么办?

可以通过关闭认证来做临时测试:

.authorizeHttpRequests((requests) -> requests
    .anyRequest().permitAll()
)

⚠️注意:这种方式仅限于本地调试阶段使用!


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

你现在已经完成了入门级别的认证系统,接下来可以尝试以下几个方向进阶:

1. 学习数据库存储用户信息(不是内存)

你可以把用户信息存在 MySQL 中,而不是硬编码在代码里。

关键词JPA, Spring Data JPA, UserDetailsService

2. 使用更安全的密码编码方式(BCrypt)

.withDefaultPasswordEncoder() 不适合生产环境,推荐换成 BCrypt 编码器。

关键词PasswordEncoder, BCryptPasswordEncoder

3. 学会控制不同用户的角色权限

比如管理员能看到所有数据,普通用户只能看部分。

关键词.hasRole(), .hasAuthority()

4. 继续学习 OAuth2 和 JWT

用于现代互联网公司常见的三方授权与 Token 登录机制。


总结

在这篇面向初学者的教程中,我们一步步搭建了一个基于 Spring Security 的登录认证系统,涵盖了:

  • 基本安全概念
  • Spring Boot 快速搭建
  • 用户登录页面实现
  • 简单的用户管理和权限配置
  • 常见问题及解决思路
  • 后续学习路线

希望你已经掌握了 Spring Security 的基础使用方法,并有信心继续深入学习后端安全知识!

祝你学习顺利,编程愉快 🚀

评论 0

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