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

你有没有想过,为什么我们在访问一些网站或系统的时候需要登录?为什么有的页面你没登录就看不到?背后其实有一套机制来保护这些资源——这正是我们今天要学的 Spring Security 所做的事情。
简单来说,Spring Security 是一个专门为 Java 应用程序设计的安全框架,它可以让我们很方便地实现用户登录、权限控制、访问限制等安全功能。不管你开发的是一个前后端分离的 Web 系统,还是一个 REST API 接口服务,Spring Security 都可以帮助你构建出一个安全可靠的后台系统。
而本文的目标就是,带你从零开始,一步步搭建一个带有“登录”和“权限控制”的简单 Spring Boot 项目,帮助你理解 Spring Security 的基本使用方式。
第一步:环境准备


1. 安装 JDK(Java Development Kit)
你需要安装 JDK 来运行 Java 程序。推荐使用 JDK 8 或更高版本。
你可以去这里下载:https://www.oracle.com/java/technologies/javase-downloads.html
安装完成后,可以在命令行输入以下命令检查是否安装成功:
java -version
javac -version
如果看到类似下面的信息就说明安装成功了:
java version "17.0.5" 2022-10-18 LTS
Java(TM) SE Runtime Environment (build 17.0.5+9-LTS-104)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.5+9-LTS-104, mixed mode, sharing)
2. 安装 IntelliJ IDEA(推荐 IDE)
IntelliJ IDEA 是 JetBrains 公司推出的一款强大的 Java 集成开发环境(IDE)。我们用它来创建项目和写代码。
可以到官网下载免费社区版:https://www.jetbrains.com/idea/download/
安装好后打开即可进入下一步。
3. 创建 Spring Boot 项目
你可以通过 https://start.spring.io/ 在线生成你的 Spring Boot 项目骨架。以下是我们的配置建议:
- Project: Maven
- Language: Java
- Spring Boot Version: 推荐 3.x(比如 3.1.x)
- Group: com.example
- Artifact: demo-security
- Name: demo-security
- Description: Demo project for Spring Security
- Package name: com.example.demo
依赖选择(Add Dependencies):
- Spring Web
- Spring Security
点击【Generate】按钮下载项目压缩包,解压后导入到 IntelliJ IDEA 中。
💡 小提示:如果你不熟悉 Maven,也不用担心,Spring Boot 已经帮我们自动配置好了绝大多数内容,我们只需要关注业务逻辑。
核心概念讲解:什么是用户认证与权限控制?
在学习 Spring Security 前,先了解几个核心概念:
1. 认证(Authentication)
就是确认“你是谁”。例如你在登录框里输入用户名和密码,系统验证无误后就知道你是张三。这个过程叫做认证。
2. 授权(Authorization)
是指系统知道你是谁之后,决定你能访问哪些资源。比如张三可以看财务报表,李四不能看。这就是授权。
3. 用户(User)
通常是一个账号信息,比如用户名、密码、角色(role),Spring Security 中用 UserDetails 对象表示。
4. 角色(Role)
用于标识用户的权限等级。例如 ROLE_USER 表示普通用户,ROLE_ADMIN 表示管理员。
5. 过滤器链(Filter Chain)
Spring Security 使用一组过滤器对请求进行安全处理,每个请求都要经过多个“安全关卡”,比如登录拦截、权限判断等。
实战项目:快速实现登录与权限管理
我们现在来一步一步做一个小项目:
目标是:
- 创建两个用户:张三(普通用户)、李四(管理员)
- 普通用户只能访问
/user/**路由 - 管理员能访问
/admin/**和/user/**路由 - 未登录用户无法访问任何受保护页面,会被跳转到登录页
第一步:添加用户配置
在 src/main/resources/application.properties 文件中添加如下内容(或者直接修改成 application.yml 更清晰):
spring.security.user.name=zhangsan
spring.security.user.password=123456
spring.security.user.roles=USER
spring.security.user.name=lisi
spring.security.user.password=admin123
spring.security.user.roles=ADMIN
💡 注意:上面的配置是 Spring Boot 默认的内存用户配置方式,适合学习阶段使用,但不适合生产环境。
第二步:配置安全规则
创建一个新的类: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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/user/**").hasAnyRole("USER")
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(login -> login
.loginPage("/login") // 自定义登录页面
.permitAll()
)
.logout(logout -> logout.permitAll());
return http.build();
}
// 创建两个内存用户
@Bean
public UserDetailsService userDetailsService() {
var userManager = new InMemoryUserDetailsManager();
var user = User.withUsername("zhangsan")
.password("{noop}123456") // 不加密密码
.roles("USER")
.build();
var admin = User.withUsername("lisi")
.password("{noop}admin123")
.roles("ADMIN")
.build();
userManager.createUser(user);
userManager.createUser(admin);
return userManager;
}
}
📌 解释一下:
authorizeHttpRequests()是设置访问权限的核心方法。requestMatchers("/user/**").hasRole("USER")表示只有角色为 USER 的用户才能访问 /user 下的所有路径。.formLogin()是开启默认的登录页面。{noop}表示不对密码做加密处理(方便测试时记忆密码)。
第三步:编写控制器(Controller)
创建一个 Controller 类:UserController.java
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/user/hello")
public String helloUser() {
return "你好,普通用户!";
}
}
再创建一个管理员控制器 AdminController.java
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AdminController {
@GetMapping("/admin/hello")
public String helloAdmin() {
return "你好,管理员!";
}
}
现在启动项目(运行 DemoSecurityApplication.java),然后尝试访问:
- 用户页面:http://localhost:8080/user/hello → 登录后可访问
- 管理员页面:http://localhost:8080/admin/hello → 只有管理员可访问
系统会自动跳转到登录页面,输入用户名密码(如 zhangsan / 123456)就能成功登录。
新手常见问题解答
1. Q:我输入正确的用户名和密码为什么还登录失败?
A:可能是因为密码格式错误。请检查你的配置是否使用 {noop} 明文密码;如果不加,Spring 会试图用 BCrypt 解密,导致验证失败。
2. Q:如何自定义登录页面?
A:你可以新建一个 HTML 页面作为登录页,并在配置中指定 .loginPage("/my-login.html"),并确保该页面允许匿名访问。
3. Q:怎么退出登录?
A:Spring Security 默认提供了 /logout 接口,发送 POST 请求即可退出。也可以在浏览器访问 http://localhost:8080/logout(POST方式)。
4. Q:我能不能把用户存在数据库里?
A:当然可以!在生产环境中,我们不会使用内存用户,而是连接数据库。这部分会在后续文章介绍。
5. Q:为什么有些请求必须用 POST?
A:出于安全考虑,比如登录、登出这种操作容易被恶意利用,Spring Security 默认只接受 POST 请求,防止攻击者利用链接诱导用户执行敏感操作。
学习建议:接下来可以学什么?
恭喜你完成了第一个 Spring Security 安全项目!你现在掌握的是最基础但最重要的部分。
接下来可以继续深入以下几个方向:
1. 数据库存储用户信息(进阶)
学会将用户数据存入 MySQL 或 PostgreSQL,使用 JDBC 或 Spring Data JPA 查询登录用户信息。
2. 前后端分离中的 Token 登录(进阶)
对于 Vue + Spring Boot 架构,可以学习 JWT、OAuth2 等现代认证方式。
3. 角色继承与细粒度权限控制(高级)
比如 ADMIN 可以继承 USER 的权限,甚至细化到某个 API 是否能调用。
4. CSRF、CORS、跨域请求管理(实战)
学习如何解决前后端分离时遇到的跨域、CSRF 攻击等问题。
总结回顾
在这篇文章中,我们一起完成了一个简单的 Spring Security 安全系统搭建,包括:
✅ 创建 Spring Boot 项目
✅ 添加 Spring Security 依赖
✅ 设置内存用户及权限
✅ 编写控制器区分权限访问
✅ 解决常见的新手问题
希望这篇教程能让你轻松入门 Spring Security,不再畏惧“安全”这个词!
下一课预告:我们将会带大家使用数据库存储用户信息,真正打造一个生产可用的安全系统!
如果你觉得这篇文章对你有帮助,不妨点个赞,收藏备用 😊

评论 0