Spring Security基础:快速搭建安全认证系统
一、开篇:Spring Security 是什么?

如果你正在学习 Java Web 开发,特别是使用 Spring Boot 框架,那你一定听说过 Spring Security。它是 Spring 家族中专门用来处理「权限控制」的模块。
简单来说,Spring Security 就是用来帮你保护你的网站或 API 不被未授权的人访问的工具。比如:
- 用户必须登录后才能访问某个页面
- 不同角色(如管理员和普通用户)能看到不同的内容
- 防止攻击者尝试暴力破解密码
今天我们就要从零开始,一起用 Spring Security 做一个非常简单的登录认证系统!
二、环境准备:先搭好开发平台

在开始编码前,你需要准备好下面这些开发工具:
所需软件/环境:
- Java JDK 17 或更高版本
- IDE:推荐 IntelliJ IDEA Community 版本
- Spring Boot Initializr 在线工具:https://start.spring.io/
- Postman(测试API用)
✅ 提示:如果你是第一次用 Spring Boot,可以先跟着这个步骤一步步来。
第一步:创建 Spring Boot 项目
我们去 https://start.spring.io/ 创建一个新项目:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新稳定版即可(例如 3.0+)
- Group: com.example
- Artifact: securitydemo
- Add Dependencies:
- Spring Web
- Spring Security
- Thymeleaf(用于展示前端页面)
点击「Generate」下载 zip 包,解压后导入到 IDE 中。
第二步:运行你的第一个 Spring Boot 应用
把项目导入 IDEA 后,找到 SecuritydemoApplication.java 文件,运行它:
@SpringBootApplication
public class SecuritydemoApplication {
public static void main(String[] args) {
SpringApplication.run(SecuritydemoApplication.class, args);
}
}
看到启动成功日志后,说明环境已经准备好了!
三、核心概念:Spring Security 的几个关键词
我们不讲太复杂的东西,先记住下面这几个重要术语,它们会帮助你理解整个流程。
1. 登录验证(Authentication)
就是判断你是谁。当用户输入用户名和密码时,系统要判断是不是合法用户。
2. 权限控制(Authorization)
确定你能做什么事情。比如管理员能删除用户,普通用户不能。
3. 角色(Role)
给用户分类的方法。常见的角色有 ROLE_USER 和 ROLE_ADMIN。
4. Security Filter Chain
过滤器链是一个“守门员”,负责检查每个请求是否允许通过。
四、实战项目:快速搭建一个登录认证系统
第一步:添加一个简单的登录页
我们在 resources 下新建一个 HTML 页面:
路径为:src/main/resources/templates/login.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<h1>欢迎登录</h1>
<form th:action="@{/login}" method="post">
<div>
<label>用户名:</label>
<input type="text" name="username" />
</div>
<div>
<label>密码:</label>
<input type="password" name="password" />
</div>
<button type="submit">登录</button>
</form>
</body>
</html>

第二步:编写控制器显示登录页
创建一个 Controller 类,用于返回登录页:
文件路径:src/main/java/com/example/securitydemo/controller/LoginController.java
package com.example.securitydemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class LoginController {
@GetMapping("/login")
public String showLoginForm() {
return "login";
}
}
这时候你可以访问:http://localhost:8080/login 看到登录界面!
第三步:配置 Spring Security
我们现在要告诉 Spring Security:
- 谁需要登录?
- 怎么处理登录过程?
创建配置类:src/main/java/com/example/securitydemo/config/SecurityConfig.java
package com.example.securitydemo.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 filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll() // 允许所有人访问首页
.anyRequest().authenticated()) // 其他请求都需要登录
.formLogin(login -> login
.loginPage("/login") // 自定义登录页
.defaultSuccessUrl("/home", true) // 登录成功跳转
.permitAll())
.logout(logout -> logout.permitAll());
return http.build();
}
}
解释几个关键点:
InMemoryUserDetailsManager:表示我们是临时把用户名和密码存内存里.anyRequest().authenticated():所有请求都必须登录.formLogin():表示我们要启用表单登录功能
第四步:添加一个受保护页面
再加一个只能登录后访问的页面:
修改 LoginController.java:
@GetMapping("/home")
public String home() {
return "home"; // 返回 templates/home.html
}
新建模板文件 src/main/resources/templates/home.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h1>欢迎来到主页!你已登录</h1>
<a href="/logout">退出登录</a>
</body>
</html>
第五步:跑起来,试试看!
重新启动程序,然后访问:
- http://localhost:8080/login → 输入 user / 123456 或 admin / admin123
- 登录成功会被跳转到
/home - 如果访问
/home没有登录,会被拦截并跳回登录页
✅ 成功!你已经完成了第一个 Spring Security 认证系统!
五、常见问题解答(FAQ)
1. Q:为什么不能直接用明文密码?
A:为了安全起见,生产环境下应该使用加密过的密码。上面的例子是为了方便初学者演示,实际要使用 Bcrypt 密码加密方式。
2. Q:为什么我访问 /home 总是提示 403?
A:可能是你没登录就访问了受保护资源,请先完成登录操作后再访问。也可以尝试清除浏览器缓存或换个浏览器无痕模式测试。
3. Q:如何实现“多个角色不同权限”?
A:可以通过 hasRole("ADMIN") 设置某接口只能由管理员访问。这部分我们会在后续课程详细讲解。
4. Q:登出按钮不起作用?
A:Spring Security 默认支持 /logout 请求,确保你用了 POST 方法。你也可以添加 <form action="/logout" method="post"> 来强制使用 POST。
六、学习建议:下一步怎么学?
恭喜你入门了 Spring Security!接下来你可以继续学习以下几个方向:
✅ 进阶知识点清单
| 学习方向 | 内容简述 |
|---|---|
| 数据库存储用户信息 | 把用户名密码存在 MySQL 等数据库中 |
| 使用 JWT 认证 | 实现前后端分离项目的 token 登录机制 |
| 配置多个登录页面 | 例如管理员页面和前台用户的登录页面分开 |
| OAuth2 登录集成 | 接入微信、QQ、GitHub 等第三方登录 |
| RBAC 权限模型 | 更复杂的权限控制逻辑 |
📚 学习资源推荐
- Spring 官方文档(英文):https://spring.io/projects/spring-security
- 《Spring Security 实战》中文书籍
- B站教学视频:“Spring Security 从入门到实战”
结语:坚持实践才是王道!
Spring Security 是 Java Web 开发中非常重要的一环。刚开始可能会有点难懂,但只要你一步一步写代码、调试、思考原理,就会慢慢掌握。
现在你已经拥有了自己的第一个安全认证系统,别忘了自己试着扩展功能,比如:
- 添加注册页面
- 实现记住我功能
- 增加登录失败提示
下一次我们再来聊聊 Spring Security 如何结合数据库做认证? 敬请期待!
📌 如果你喜欢这个教程,欢迎点赞、收藏或者转发给其他新手小伙伴!我们一起进步 💪

评论 0