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

代码小镇
2025-06-22 15:50
阅读 397

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

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

在开发一个 Web 应用程序时,安全性是一个非常重要的部分。你有没有想过,为什么很多网站要我们登录之后才能访问某些内容?这是因为这些内容是“受保护的”,只有合法用户才能访问。而实现这种保护功能的技术,正是我们要学习的——Spring Security

简单来说,Spring Security 是一个用于为 Java 应用程序提供身份验证(Authentication)和授权(Authorization)功能的安全框架。它可以帮助你轻松实现:

  • 用户登录功能
  • 权限控制(比如管理员能看什么、普通用户能看什么)
  • 防止攻击(如 CSRF、Session Fixation 等)
  • 与其他认证方式集成(如 OAuth2、LDAP、JWT 等)

今天我们就要从零开始,手把手教你如何使用 Spring Security 搭建一个最基本的安全认证系统!


环境准备:搭建你的开发环境

环境准备:搭建你的开发环境

想要开始使用 Spring Security,我们需要准备好以下几个工具:

✅ 必备工具清单:

  1. Java 17 或以上版本
  2. IDE(推荐 IntelliJ IDEA 或 Eclipse)
  3. Maven 构建工具
  4. Spring Boot 初始项目模板

🛠 步骤一:安装 Java

如果你还没安装 Java,可以从官网下载 JDK: 👉 https://www.oracle.com/java/technologies/downloads/

✅ 小贴士:推荐使用 Adoptium 提供的 OpenJDK,免费好用!
下载地址:https://adoptium.net/zh-CN/temurin/releases/

安装完成后,在命令行输入:

java -version

你会看到类似这样的输出:

openjdk version "17.0.5" 2022-10-18
OpenJDK Runtime Environment Temurin-17.0.5+8 (build 17.0.5+8)
OpenJDK 64-Bit Server VM Temurin-17.0.5+8 (build 17.0.5+8, mixed mode)

说明 Java 安装成功!


🛠 步骤二:安装 IDE

推荐使用 IntelliJ IDEA Community 版本,完全免费,功能强大。

安装后打开,稍等片刻即可使用。


🛠 步骤三:创建 Spring Boot 项目

最简单的办法是使用 Spring Initializr 自动生成项目结构:

访问官方站点:https://start.spring.io/

然后按下面设置:

项目属性
Project Maven
Language Java
Spring Boot Version 推荐 3.x 以上版本
Group com.example
Artifact demo
Name demo
Packaging Jar
Java Version 17

勾选以下依赖项:

  • Spring Web(构建 Web 应用的基础)
  • Spring Security

然后点击【Generate】按钮下载生成好的项目压缩包。

解压压缩包,并用 IntelliJ IDEA 打开这个项目文件夹。

恭喜你!你现在拥有了一个可以运行的 Spring Boot + Spring Security 的项目!


核心概念:通俗理解 Spring Security 的几个关键词

核心概念:通俗理解 Spring Security 的几个关键词

为了更好地理解和使用 Spring Security,我们需要先了解几个核心概念。


🔐 身份验证(Authentication)

什么是身份验证?就像你在公司刷门禁卡进门,刷卡的过程就是你在证明自己是谁。

在 Web 应用中,“身份验证”指的是:确认当前访问系统的人(或设备)是它所声称的那个人

举个例子:

  • 当你在网页输入用户名和密码提交登录,系统就会验证你是否是该用户的真正拥有者。
  • 如果验证通过,就表示这个人“登录成功”。

🔒 授权(Authorization)

授权指的是:允许某个已认证的用户执行某些操作或者访问某些资源。

比如:

  • 管理员能看到所有用户的信息;
  • 普通用户只能看到自己的信息。

即使你已经登录,也不能随便访问别人的数据,因为你不具备权限。


👤 用户详情服务(UserDetailsService)

这是 Spring Security 里的一个接口,它的作用是帮助系统获取用户信息(例如从数据库加载用户)。

我们可以自定义一个类来实现这个接口,告诉系统:“我知道怎么从数据库里找到用户数据。”


🔐 安全配置类(SecurityFilterChain)

你可以把它理解为一个“保安经理”,它负责制定规则,决定哪些人可以进办公室、哪些人需要登记、哪些人不允许进入。

我们会编写一个配置类,告诉 Spring Security:

  • 哪些 URL 是所有人都能访问的?
  • 哪些 URL 只有登录才能访问?
  • 使用哪种登录方式(表单登录、OAuth 登录等)?

现在,我们已经对 Spring Security 的几个关键概念有了基本认识了,下面我们就来动手实战搭建一个简单的项目!


实战项目:一步一步搭建安全登录系统

我们现在来做一个完整的实践:从搭建一个最简登录页面开始,到完成基于内存的用户认证功能,让你体验一下 Spring Security 是怎么工作的。


🧱 第一步:创建 Controller 和前端页面

我们在项目的控制器中添加一个简单的 Hello 页面:

创建控制器类 HelloController.java

package com.example.demo;

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

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "hello"; // 返回 hello.html 页面
    }
}

🧱 第二步:创建前端页面 hello.html

src/main/resources/templates/ 目录下新建一个 HTML 文件:hello.html,内容如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8"/>
    <title>Hello</title>
</head>
<body>
    <h1>Hello World!</h1>
    <p>这是一个受保护的页面,请先登录。</p>
</body>
</html>

🚧 第三步:启动项目并测试未认证访问

现在运行主程序 DemoApplication.java,访问 http://localhost:8080/hello

你会发现浏览器跳转到了默认登录页:

Username: user
Password: 控制台显示的随机密码

没错,Spring Boot 默认为我们自动开启了一个临时登录系统,其中有一个默认用户 user。

但我们希望改成我们自己的用户管理系统,对吧?


⚙️ 第四步:手动配置安全策略

接下来我们要编写一个安全配置类,替换默认的安全策略。

创建一个新的配置类:

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.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 users() {
        UserDetails admin = User.withDefaultPasswordEncoder()
                .username("admin")
                .password("123456")
                .roles("ADMIN")
                .build();
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("123456")
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(admin, user);
    }

    // 配置访问规则和登录页面
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/hello").authenticated()   // /hello 页面必须登录才能访问
                .anyRequest().permitAll()                     // 其他请求全部放行
            )
            .formLogin(login -> login
                .loginPage("/login")           // 自定义登录页面路径
                .defaultSuccessUrl("/hello", true)
                .permitAll()
            )
            .logout(logout -> logout.permitAll());
        return http.build();
    }
}

🧱 第五步:添加自定义登录页面 login.html

templates 文件夹下新增一个 login.html 页面:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8"/>
    <title>登录页面</title>
</head>
<body>
<h2>欢迎登录</h2>

<form method="post" action="/login">
    <div>
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username"/>
    </div>
    <div>
        <label for="password">密码:</label>
        <input type="password" id="password" name="password"/>
    </div>
    <button type="submit">登录</button>
</form>
</body>
</html>

🧱 第六步:添加登录控制器

我们还需要加一个 /login 路由,把 login.html 显示出来:

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

将上面的代码放在 HelloController.java 中,完整示例如下:

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

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

🚀 第七步:运行并测试完整流程

重新启动项目:

  1. 访问 http://localhost:8080/hello
  2. 页面会跳转到 /login
  3. 输入用户名 admin,密码 123456
  4. 成功跳转到 hello.html 页面!

✨恭喜你!你已经完成了第一个 Spring Security 登录系统!


常见问题:新手可能会遇到的问题及解决方法

❓ Q1:Spring Security 默认登录页面为什么不见了?

答:因为你重写了安全配置类,并设置了 .loginPage("/login"),此时默认页面失效,你需要自己提供一个登录页面(我们刚刚做了)。


❓ Q2:为什么会提示 "There is no PasswordEncoder mapped for the id ‘null’"?

答:这个问题是因为没有为密码指定加密方式导致的错误。

解决方案:

  • 使用 User.withDefaultPasswordEncoder() 方法(适用于简单练习)
  • 在生产环境中使用更安全的加密方式,比如 BCryptPasswordEncoder(后面我们会讲)

❓ Q3:我想让某些页面不需要登录就能访问怎么办?

答:修改配置类中 .authorizeHttpRequests() 方法,比如:

.requestMatchers("/login", "/css/**", "/js/**").permitAll()

这样可以让 /login 页面、CSS、JS 文件不需要登录就能访问。


❓ Q4:如何退出登录?

答:访问默认的 /logout 路径即可。Spring Security 默认支持注销功能,只要你是 POST 请求即可。


学习建议:下一步可以学什么?

恭喜你已经掌握了 Spring Security 的基础应用!接下来你可以沿着以下方向继续深入学习:

负载均衡配置-2

🔍 逐步提升路线图:

  1. 【下一阶段】学习 BCrypt 密码加密机制,替代默认明文密码
  2. 【重要技能】实现与数据库集成,用 JDBCUserDetailsManager 从 MySQL 获取用户信息
  3. 【常用功能】集成 Thymeleaf 前端,动态展示用户权限内容
  4. 【高级特性】学习 JWT 认证,搭建无状态 RESTful API 接口安全体系
  5. 【扩展能力】接入第三方登录,比如微信、GitHub、Google OAuth2 等

总结

服务器部署方案-1

今天我们从零开始搭建了一个使用 Spring Security 的登录认证系统。虽然这只是一个入门级别项目,但它涵盖了认证流程的核心要素:用户管理、权限控制、登录页面定制和常见安全配置。

通过这篇文章,你应该已经明白:

✅ 什么是 Spring Security
✅ 如何搭建开发环境
✅ 最核心的身份认证原理
✅ 怎么用 Spring Security 实现简单登录系统
✅ 新手容易踩坑的地方和解决方法
✅ 后续应该继续学习的内容

💡 温馨提醒:多写代码、多尝试,是最好的学习方式!

如果你觉得这篇教程对你有帮助,欢迎收藏、转发,也欢迎继续关注我的系列教程《Spring Security 进阶实战》😊


如有疑问,可以在评论区留言提问,我会尽快回答你!
祝你学习愉快,早日成为 Spring Security 大牛!💪

评论 0

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