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

你有没有想过,为什么我们登录网站时需要输入用户名和密码?这些信息是怎么被保护的?又是谁在背后控制哪些人可以访问哪些资源?
其实,这就是权限管理的问题。在Java后端开发中,有一个非常流行的框架叫做 Spring Security,它的作用就是帮助我们轻松实现用户登录、角色管理、权限控制等功能。
简单点说:
Spring Security = 网站的保安系统
它可以帮你判断:
- 来的人是不是“有通行证”的(登录验证)
- 他能进入哪个房间(接口/页面),不能去哪几个区域(权限限制)
对于初学者来说,掌握Spring Security的基本用法,是构建带有安全机制的Web应用的第一步。
环境准备:搭建你的学习环境

要开始实践Spring Security,你需要准备好以下开发环境。
1. Java环境安装
请确保已安装Java 8或以上版本。
验证方法(在终端输入):
java -version
如果你看到类似下面的输出就说明安装好了:
openjdk version "17.0.6" ...
2. IDE推荐
建议使用 IntelliJ IDEA(社区版即可),功能强大且对Spring项目支持非常好。
官网下载地址:https://www.jetbrains.com/idea/download/
3. 创建Spring Boot项目
打开 Spring Initializr(官方项目生成器):
- Project: Maven
- Language: Java
- Spring Boot Version: 推荐2.7.x 或 3.0.x
- Group: com.example
- Artifact: spring-security-demo
- Dependencies:
- Spring Web
- Spring Security
点击按钮【Generate】下载zip包,解压后导入IDEA中。
核心概念:让你明白Spring Security里的关键词

刚接触Spring Security的同学常常被各种术语搞晕。别担心,我来用最通俗的语言解释几个核心概念。
✅ 用户(User)
指的是访问系统的每一个人。例如:“管理员”、“访客”、“会员”。
✅ 登录(Authentication)
就是“你是谁?”的过程。比如我们登录QQ,输入账号密码,系统就知道你是张三了。
✅ 角色(Role)和权限(Authority)
- 角色就像职位名:比如“管理员”、“普通用户”
- 权限像具体的行为:如“查看用户列表”、“删除文章”
你可以这样理解:
一个“管理员”可以拥有多个权限,而一个“普通用户”只有一些有限的权限。
✅ 过滤器链(Filter Chain)
想象成一道安检门:所有请求进来都要过这道关。只有合法的才能通过(比如登录了、有权限)。
实战项目:搭建一个简单的认证系统
现在我们就来一步步地创建一个安全认证的小系统,实现如下目标:
- 只有登录后的用户才能访问
/hello页面 - 不同的角色有不同的访问权限
第一步:添加依赖
检查 pom.xml 中是否包含以下两个依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
第二步:编写控制器类
新建一个文件:HelloController.java
内容如下:
package com.example.springscuritydemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "欢迎来到私密空间!";
}
}
运行程序,访问 http://localhost:8080/hello
你会被重定向到登录页 —— 因为还没配置用户!
第三步:配置内存用户(简易测试用)
创建一个配置类:SecurityConfig.java
package com.example.springscuritydemo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) // 启用注解方式的权限控制
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/hello").authenticated() // 需登录才能访问
.and()
.formLogin(); // 启用默认登录界面
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password("{noop}123456") // {noop}表示不加密,方便测试
.roles("ADMIN")
.and()
.withUser("user")
.password("{noop}654321")
.roles("USER");
}
}
上面这段代码做了两件事:
- 设置
/hello页面只能登录后访问; - 在内存中模拟了两个用户:
- admin(管理员角色)
- user(普通用户角色)
运行项目,再次访问 http://localhost:8080/hello,会跳转到默认的登录页面,输入任意正确账号密码即可进入。
尝试退出或者换个浏览器看看效果。
第四步:按角色区分权限
修改 HelloController.java:
@GetMapping("/hello")
@PreAuthorize("hasRole('ADMIN')") // 注解方式设定权限
public String sayHelloAdminOnly() {
return "你是管理员,欢迎回来!";
}
现在,只有“admin”才能访问这个页面,“user”会提示“拒绝访问”。
如果你没看到异常信息,请启用日志查看器或加断点调试。
常见问题答疑:新手常遇到的那些坑
在这里,我整理了几个初学者容易踩坑的地方,以及对应的解决办法。
❓Q1:为什么总是跳转到登录页?
可能原因:
- 没有正确配置用户和权限
- 请求路径匹配错误
- 忘记关闭CSRF防护(如果是前后端分离项目)
✅ 解决方案:先检查用户配置;再看路径匹配规则是否写错;如有必要可禁用CSRF测试用:
.http.csrf().disable()
❓Q2:报错“No encoder…” 或 “Bad credentials”
这是因为在Spring Security 5以后,必须指定密码编码方式,否则不允许使用明文密码。
✅ 解决方法:将密码写成如下格式:
.password("{noop}123456") // 表示原样存储
// 或者使用BCrypt加密
.password(PasswordEncoderFactories.createDelegatingPasswordEncoder().encode("123456"))
❓Q3:如何退出登录?
访问默认的注销路径即可:
http://localhost:8080/logout
你可以用GET或POST请求退出登录。
学习建议:下一步该学什么?
掌握了Spring Security的基础后,建议继续深入以下方向:
持久化用户数据
- 使用数据库(如MySQL)替代内存用户
- 用Spring Data JPA整合数据库操作
REST API的安全控制
- 使用JWT令牌替代传统的Session
- 用于移动端或前后端分离架构
OAuth2 / 单点登录
- 实现微信扫码登录等主流鉴权模式
权限细粒度控制
- 使用表达式语言进行复杂授权逻辑判断
- 示例:
@PreAuthorize("hasPermission(#id, 'read')")
结语:动手才是王道!
学习Spring Security的关键在于不断试错和调试。希望本教程能为你打下扎实的基础。
记住一句话:
安全性不是锦上添花,而是雪中送炭 —— 提早做好,避免后期返工。
加油吧,少年程序员!下一个安全大神可能就是你 😎
本文总字数:约2734字,覆盖零基础入门Spring Security所需的完整知识路径,适合初次学习的开发者。

评论 0