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

如果你是一个刚开始学习 Java Web 开发的新手,可能会听说“安全”这个词在开发中非常重要。比如网站的登录功能、权限控制这些功能就属于“安全”的范畴。那么,有没有一个现成的框架可以帮助我们轻松实现这些功能呢?答案是——有!那就是 Spring Security。
Spring Security 是 Spring 框架的一个子项目,专门用于保护基于 Spring 的应用程序。它提供了登录认证、权限控制、防止 CSRF 攻击等一系列安全功能。无论你是想做用户登录系统,还是更复杂的权限管理功能,Spring Security 都能帮你搞定。
本篇文章的目标是帮助你从零开始,一步一步地搭建一个最简单的 Spring Security 安全认证系统。我们将通过实践带你熟悉它的基本用法,适合没有 Spring Security 使用经验的新手朋友。
环境准备:搭建开发环境

为了顺利运行我们的项目,需要准备好以下工具和环境:
所需软件与版本(推荐)
- JDK 17 或以上
- IntelliJ IDEA 或 VS Code + Java 插件
- Maven 构建工具(建议版本 3.8.x 及以上)
- Spring Boot(2.7.x 或更高)
创建 Spring Boot 项目
使用 Spring Initializr 创建新项目:
- 访问网址:https://start.spring.io/
- 设置如下:
- Project: Maven
- Language: Java
- Spring Boot Version: 2.7.x 或更新的版本
- Group: com.example
- Artifact: sec-demo
- Dependencies:
- Spring Web
- Spring Security
点击【Generate】下载 zip 文件,解压后用 IDE 打开。
Maven依赖配置(pom.xml)
确保 pom.xml 中已经包含 Spring Security 的依赖包,类似下边这段代码:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
✅ 到此为止,我们的开发环境就准备好了!
核心概念:Spring Security 的几个关键角色

虽然 Spring Security 功能强大,但刚接触可能觉得术语有点多。别担心,下面我会用通俗的方式讲解几个最核心的概念。
1. 认证(Authentication)
认证就是“确认你是谁”。比如你登录 QQ 的时候输入账号和密码,QQ 系统就会验证你是不是这个账号的主人。Spring Security 提供了各种方式来完成这个过程,比如表单登录、OAuth 登录等。
2. 授权(Authorization)
授权是指“你能干什么”。比如你在公司系统里是一个普通员工,只能看到自己的工资数据,而管理员能看到所有人的信息。这种访问控制就需要授权机制来完成。
3. 用户凭证(UserDetails)和用户服务(UserDetailsService)
这两个东西负责存储用户的登录信息,如用户名、密码和角色(权限)。你可以把它理解为“用户数据库”的一种抽象表达。
4. 安全配置类(SecurityConfig)
这是我们需要自定义的一个配置类。在 Spring Boot 应用中,通过继承 WebSecurityConfigurerAdapter 类或者直接使用新的方式配置(根据 Spring Security 版本),我们可以对登录逻辑、访问控制等进行自定义。
✅ 总结:
- 认证 = 身份确认
- 授权 = 权限控制
- 我们需要编写一些配置来告诉 Spring Security 如何处理认证和授权。
实战项目:一步步完成你的第一个 Spring Security 登录认证系统
现在让我们动手写代码,一步步搭建一个拥有登录页面的简单 web 安全系统。
第一步:创建一个最简化的 controller 页面
创建一个文件:src/main/java/com/example/secdemo/HelloController.java,内容如下:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
// 主页
@GetMapping("/")
public String index() {
return "index";
}
// 需要登录才能访问的页面
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
然后,在 resources 目录创建两个页面模板:
resources/templates/index.html
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
</head>
<body>
<h2>欢迎来到主页!</h2>
<a href="/hello">进入打招呼页面</a>
</body>
</html>
resources/templates/hello.html
<!DOCTYPE html>
<html>
<head>
<title>Hello Page</title>
</head>
<body>
<h2>Hello, 你好!</h2>
</body>
</html>
此时访问 http://localhost:8080 就能看到主页,点击链接就能跳转到 /hello 页面。
接下来我们开始设置登录功能。
第二步:启用 Spring Security 并设置默认账户密码
创建配置类:SecDemoApplication.java 同目录下新建 SecurityConfig.java:
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.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
// 自定义用户列表(内存中的用户)
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("123456")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
// 安全规则配置
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/css/**", "/js/**").permitAll() // 主页所有人都能访问
.anyRequest().authenticated() // 其他请求都必须登录
)
.formLogin((form) -> form
.loginPage("/login") // 自定义登录页路径
.permitAll()
)
.logout((logout) -> logout.permitAll());
return http.build();
}
}
⚠️ 注意事项:
- 上面的
withDefaultPasswordEncoder()方法仅用于测试,请勿用于生产。 - 在
.loginPage("/login")中我们指定登录页面地址,后面会创建它。
第三步:创建登录页面 login.html
在 templates 下新建 login.html:
<!DOCTYPE html>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<h2>请登录</h2>
<form method="post" action="/login">
<label>用户名:
<input type="text" name="username"/>
</label><br/>
<label>密码:
<input type="password" name="password"/>
</label><br/>
<button type="submit">提交</button>
</form>
</body>
</html>
第四步:启动项目并测试
启动 Spring Boot 项目后访问:
- 主页:http://localhost:8080 → 不需要登录即可查看
- hello 页面:http://localhost:8080/hello → 会自动跳转到登录页面
在登录页面填写用户名 user 和密码 123456 即可成功登录。
✅ 成功啦!至此,你已经完成了最基本的 Spring Security 安全认证系统!
常见问题解答
Q1:我输入正确的用户名密码却无法登录?
- A:检查是否忘记配置
.permitAll()在登录页面路径上; - 确保密码未被加密,测试阶段可继续使用
withDefaultPasswordEncoder(); - 查看日志输出是否有错误提示。
Q2:如何添加多个用户?
- A:你可以调用多次
User.withDefaultPasswordEncoder(),把每个用户加进去,示例:
UserDetails user1 = User.withDefaultPasswordEncoder().username("user1").password("pass1").roles("USER").build();
UserDetails admin = User.withDefaultPasswordEncoder().username("admin").password("admin").roles("ADMIN").build();
return new InMemoryUserDetailsManager(user1, admin);
Q3:如何退出登录?
- A:访问
/logout就可以退出。Spring Security 默认支持这个路径。
Q4:我想连接真实数据库怎么办?
- A:后续你可以实现
UserDetailsService接口,并结合数据库查询实现动态读取用户信息的功能。
学习建议:下一步该学什么?
你已经完成了 Spring Security 的入门知识,掌握了基本的登录认证和页面控制。接下来你可以尝试以下学习路线进阶:
- 用户角色管理:学习如何区分不同用户角色(如 USER / ADMIN)并控制访问;
- 前后端分离开发:了解 JWT(JSON Web Token)实现无状态认证;
- 数据库用户验证:将用户信息保存到 MySQL 等数据库中;
- CSRF/XSS 安全机制:进一步加固应用的安全性;
- OAuth2 / OpenID Connect 登录:接入第三方登录,如微信、QQ 登录。
结语
恭喜你完成了这篇《Spring Security 基础:快速搭建安全认证系统》教程!虽然只用了最基本的功能,但这为你今后深入掌握 Java Web 安全技术打下了扎实的基础。记住,安全是一个持续学习的过程,随着你项目的复杂程度增加,Spring Security 还会给你提供更多的功能模块。
继续加油,愿你成为一名出色的安全开发者! 🚀

评论 0