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

在开发网站或应用时,用户登录和权限控制是极其重要的功能。例如:
- 只有注册用户才能访问某些页面
- 管理员可以管理所有内容,普通用户只能看不能改
- 某些接口只能特定角色访问,比如
/api/admin只允许管理员调用
这些功能就是安全控制的核心任务。
那么,Spring Security 是什么?
Spring Security 是 Spring 框架的一个模块,专门用来帮助开发者实现:
- 用户登录验证(认证)
- 用户权限控制(授权)
- 安全访问控制(防止未授权访问)
简单来说,它就像一个“安全门卫”,帮你挡住未经授权的访问者。
🧑🏫 小贴士:你可以把 Spring Security 看作是公司大楼门口的安全门禁系统 —— 只有持有工卡的人才能进楼,而不同工卡有不同的楼层权限。
本教程适合完全零基础的新手,通过一步步操作,你将学会如何用 Spring Security 实现基本的登录、权限控制和安全保护。
环境准备:搭建项目所需的基础环境

要使用 Spring Security,你需要安装以下工具:
✅ 1. JDK(Java Development Kit)
Spring Boot 基于 Java,因此必须安装 JDK。建议使用 JDK 8 或以上版本,推荐安装 OpenJDK。
✅ 2. IDE(推荐 IntelliJ IDEA 或 Eclipse)
推荐使用 IntelliJ IDEA 社区版,免费好用,下载地址:https://www.jetbrains.com/idea/download/
✅ 3. 创建 Spring Boot 项目
打开浏览器访问:https://start.spring.io,这是 Spring 提供的项目初始化工具。
设置如下选项:
- Project: Maven
- Language: Java
- Spring Boot Version: 任意稳定版本(如 3.1.x)
- Group: com.example
- Artifact: demo-security
- Name: DemoSecurityApplication
- Dependencies:
- Spring Web
- Spring Security
点击按钮 “Generate” 下载项目压缩包,解压后用 IDE 打开。
核心概念:让你快速理解 Spring Security 关键术语
即使你是新手,也别担心!我们用最简单的语言来解释这些概念。
🛡️ 认证 vs 授权
| 概念 | 解释 | 类比 |
|---|---|---|
| 认证 (Authentication) | 判断用户是不是合法的用户 | 查身份证 |
| 授权 (Authorization) | 判断用户能做什么(有哪些权限) | 身份证上写着能不能开车 |
👥 用户、角色、权限三兄弟
- 用户(User):使用系统的个体,如张三、李四。
- 角色(Role):一种身份分类,如管理员(ADMIN)、普通用户(USER)。
- 权限(Authority):具体的操作能力,比如查看订单、修改数据等。
🔒 安全配置类(SecurityConfig)
这是你写安全规则的地方,比如:
- 哪些页面需要登录?
- 登录后跳转到哪个页面?
- 不同角色能访问哪些接口?
实战项目:动手搭建一个带登录功能的 Spring Boot 应用
我们来一步一步地完成一个具有基本登录和权限控制的小型项目。
第一步:启动项目,访问默认登录页
当你运行 DemoSecurityApplication.java 后,项目会在 http://localhost:8080 启动。
访问该地址,默认会跳转到一个自动创建的登录页面:
Username: user
Password: 控制台输出的一串随机密码(如:5d6c9f3a-d0e1-4...)
这表示 Spring Security 默认启用了一个临时账号,供测试使用。
⚠️ 提示:为了方便学习,我们接下来将自己定义用户名和密码。
第二步:自定义用户登录信息
我们要自己定义用户账号,而不是使用系统自动生成的。
修改 application.properties 文件
添加以下内容:
spring.security.user.name=admin
spring.security.user.password=123456
spring.security.user.roles=USER
现在你可以用用户名 admin 和密码 123456 登录了。
第三步:创建一个安全配置类,实现 URL 权限控制
创建一个新类:SecurityConfig.java,放在 com.example.demosecurity.config 包下。
package com.example.demosecurity.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 userDetailsManager() {
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("123456")
.roles("ADMIN")
.build();
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("user123")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(admin, user);
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasAnyRole("ADMIN", "USER")
.anyRequest().authenticated()
)
.formLogin(login -> login
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
)
.logout(logout -> logout.permitAll());
return http.build();
}
}
这段代码做了几件事:
- 定义了两个用户:admin 和 user
- 设置不同的访问权限:
"/":所有人都能访问"/admin/**":只有管理员能访问"/user/**":普通用户和管理员都能访问- 其他请求都需要登录
第四步:创建控制器,编写一些测试页面
新建一个 Controller 类:HomeController.java
package com.example.demosecurity.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String index() {
return "index";
}
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/home")
public String home() {
return "home";
}
@GetMapping("/admin/dashboard")
public String adminDashboard() {
return "admin-dashboard";
}
@GetMapping("/user/profile")
public String userProfile() {
return "user-profile";
}
}
第五步:创建 Thymeleaf 页面(用于展示)
如果你没引入 Thymeleaf,记得在 pom.xml 中添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
然后创建 HTML 页面文件:
resources/templates/index.htmlresources/templates/login.htmlresources/templates/home.htmlresources/templates/admin-dashboard.htmlresources/templates/user-profile.html
以 login.html 为例,简单写点东西即可:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Login</title>
</head>
<body>
<h2>Login Page</h2>
<form th:action="@{/login}" method="post">
<div>
<label>Username:
<input type="text" name="username"/>
</label>
</div>
<div>
<label>Password:
<input type="password" name="password"/>
</label>
</div>
<button type="submit">Login</button>
</form>
</body>
</html>
常见问题解答:新手最容易犯的错误及解决方案
❓ 问题1:登录时提示“Bad credentials”
✅ 解决方案:
- 检查用户名或密码是否输入正确
- 如果你设置了
InMemoryUserDetailsManager,确保密码使用.withDefaultPasswordEncoder()处理过了 - 新版本 Spring Boot 使用的是更严格的密码编码策略,所以不要手动写明文密码
❓ 问题2:为什么访问 /admin/** 报 403?
✅ 解决方案:
- 检查是否给用户分配了 ADMIN 角色
- 检查路径是否与
.requestMatchers("/admin/**")匹配 - 清除浏览器缓存或使用隐身模式重新登录
❓ 问题3:怎么退出登录?
✅ 解决方案:
- 添加一个链接
<a href="/logout">Logout</a>即可 - Spring Security 自动处理
/logout请求并清除 session
❓ 问题4:为什么没有显示自定义的登录页?
✅ 解决方案:
- 检查
/login路径是否有 Controller 方法映射 - 确保模板名称对应
login.html并位于resources/templates/目录 - 加入 Thymeleaf 依赖
学习建议:下一步你可以学什么?
恭喜你完成了第一个 Spring Security 项目!
✅ 推荐继续学习的内容:
数据库集成用户认证
- 使用 MySQL 存储用户信息
- 使用
JDBCUserDetailsService
RBAC 权限模型
- 角色 + 权限的精细化控制
- 动态权限管理
JWT 认证
- 基于 Token 的无状态认证方式
- 适用于前后端分离架构
OAuth2 / SSO 登录
- 支持第三方登录(如微信、GitHub)
- 企业级单点登录系统
结语
虽然刚开始接触 Spring Security 会觉得有点复杂,但只要你跟着步骤实践,一步步来,就能慢慢掌握它的核心思想。
记住一句话:Spring Security 本质上就是帮我们判断“谁是谁”、“谁能干什么”。
希望这个教程能成为你入门 Spring Security 的第一块砖头,助你打下坚实的后端安全基础!
🎯 文章总字数:约 2592 字

评论 0