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

在我们构建Web应用程序时,安全性是一个非常重要的方面。我们需要确保只有授权用户才能访问某些资源或功能。这就是Spring Security的用武之地。Spring Security是Spring框架的一部分,专门用于为应用程序提供认证和授权功能。通过它,我们可以轻松实现用户登录、密码管理、角色权限控制等功能。
Spring Security的核心用途:
- 用户认证(Authentication):确认用户的身份。
- 授权(Authorization):确定用户是否有权访问某个资源或执行某个操作。
本文将带领零基础的你逐步了解并实践如何使用Spring Security来保护你的Web应用。
环境准备:详细的开发环境搭建步骤

在开始之前,请确保你的开发环境中已经安装了以下工具:
Java JDK 8及以上版本:
Maven(项目构建工具):
- 检查是否已安装Maven:
mvn -v - 如果未安装,请从 Maven官网 下载并配置环境变量。
- 检查是否已安装Maven:
IDE(推荐IntelliJ IDEA或Eclipse):
- IntelliJ IDEA社区版即可满足需求。
- 下载地址:JetBrains官网
Spring Boot依赖管理:
- 我们将使用Spring Boot简化开发流程,因此需要在项目中引入相关依赖。
创建Spring Boot项目
- 打开浏览器,访问 Spring Initializr。
- 配置项目信息:
- Project: Maven Project
- Language: Java
- Spring Boot: 最新稳定版本
- Group: 自定义包名(例如
com.example.security) - Artifact: 项目名称(例如
security-demo) - Dependencies:
- Spring Web
- Spring Security
- Thymeleaf(用于前端模板)
- 点击“Generate”按钮下载项目压缩包。
- 解压后,导入到IDE中。
核心概念:用通俗的语言解释关键概念

在深入代码之前,让我们先理解一些核心概念。
认证(Authentication)
认证是用来验证用户身份的过程。简单来说,就是确认“你是谁”。例如,用户输入用户名和密码后,系统会检查这些凭据是否正确。授权(Authorization)
授权是指决定用户是否有权访问某个资源或执行某个操作。例如,普通用户不能删除其他用户的信息,但管理员可以。过滤器链(Filter Chain)
Spring Security通过一系列的过滤器来拦截请求并执行安全检查。这些过滤器就像一道道关卡,确保每个请求都经过必要的验证。安全上下文(Security Context)
安全上下文存储了当前用户的认证信息,比如用户名、角色等。通过它可以获取当前登录用户的相关数据。
实战项目:一步步完成一个简单项目
接下来,我们将创建一个简单的Web应用,并为其添加基于Spring Security的安全保护。
第一步:编写基本的控制器和页面
- 在
src/main/java/com/example/security目录下创建一个名为HelloController.java的文件:
package com.example.security;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/")
public String home() {
return "home"; // 映射到 home.html
}
@GetMapping("/admin")
public String admin() {
return "admin"; // 映射到 admin.html
}
}
- 在
src/main/resources/templates目录下创建两个HTML文件:home.html:<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Home</title> </head> <body> <h1>Welcome to the Home Page!</h1> <a th:href="@{/admin}">Go to Admin Page</a> </body> </html>admin.html:<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Admin</title> </head> <body> <h1>Welcome to the Admin Page!</h1> <a th:href="@{/}">Back to Home</a> </body> </html>
运行项目,访问 http://localhost:8080/,你会看到一个简单的首页。
第二步:启用Spring Security
默认情况下,Spring Security会自动保护所有端点。如果尝试访问 /admin,系统会要求你登录。为了自定义安全配置,我们需要创建一个配置类。
- 在
src/main/java/com/example/security目录下创建SecurityConfig.java:
package com.example.security;
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").permitAll() // 允许所有人访问首页
.antMatchers("/admin").hasRole("ADMIN") // 仅允许 ADMIN 角色访问 /admin
.anyRequest().authenticated() // 其他请求需要认证
.and()
.formLogin() // 启用表单登录
.loginPage("/login") // 自定义登录页面
.permitAll() // 允许匿名访问登录页面
.and()
.logout()
.permitAll(); // 允许匿名访问注销功能
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // 密码加密器
}
}
- 修改
HelloController,添加一个登录页面:
@GetMapping("/login")
public String login() {
return "login"; // 映射到 login.html
}
- 在
src/main/resources/templates目录下创建login.html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form method="post" action="/login">
<label for="username">Username:</label>
<input type="text" id="username" name="username"><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password"><br><br>
<button type="submit">Login</button>
</form>
</body>
</html>
第三步:定义用户和角色
为了让用户能够登录,我们需要定义一些用户及其角色。我们可以通过内存中的方式模拟用户数据。
- 修改
SecurityConfig.java,添加内存用户支持:
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.withUsername("user")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
UserDetails admin = User.withUsername("admin")
.password(passwordEncoder().encode("admin"))
.roles("ADMIN", "USER")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
现在,项目中有两个用户:
- 用户名:
user,密码:password,角色:USER - 用户名:
admin,密码:admin,角色:ADMIN,USER
运行项目,访问 http://localhost:8080/admin,你会被重定向到登录页面。输入正确的用户名和密码即可访问。
常见问题:新手容易遇到的问题和解决方案
登录后仍然无法访问受保护页面
可能原因是密码未正确加密。请确保使用BCryptPasswordEncoder对密码进行编码。页面样式丢失
如果静态资源(如CSS、JS)无法加载,可能是因为它们被Spring Security保护了。可以在securityFilterChain中添加以下规则:.antMatchers("/css/**", "/js/**", "/images/**").permitAll()找不到登录页面
确保登录页面路径与配置一致,且模板文件名正确。
学习建议:下一步的学习路径
深入学习Spring Security的高级功能
- OAuth2集成
- JWT(JSON Web Token)认证
- CSRF防护
探索数据库用户管理
使用Spring Data JPA将用户和角色存储在数据库中。学习更多前端技术
结合React或Vue.js创建更现代化的前端界面。
通过以上内容,你已经掌握了Spring Security的基本用法!继续练习和探索,相信你会越来越熟悉这个强大的安全框架。

评论 0