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