Spring Security基础:快速搭建安全认证系统(零基础入门教程)
大家好,我是B站的技术UP主小码哥。最近很多粉丝私信问我:“Spring Security到底怎么上手?文档太复杂了!”我特别理解这种感受——我当初学的时候也是一头雾水,官方文档术语一堆,配置又多,完全不知道从哪下手。
今天这篇文章,我就用最简单、最直白的方式,带你从零开始搭建一个带登录认证的Web应用。即使你之前没碰过Java,只要会点Python,也能看懂!
为什么我会提到Python?
因为很多初学者是从Python转过来的。别担心,我会在对比中帮你理解Java生态的概念。
一、Spring Security 是什么?能做什么?
简单说:Spring Security 就是给你的网站加“门禁系统”。
- 没登录?不让进后台!
- 普通用户?不能删别人的数据!
- 管理员?可以访问所有功能!
它能自动处理:
- 用户登录/登出
- 密码加密
- 权限控制(谁可以访问哪个页面)
- 防止CSRF攻击(一种常见的Web攻击)
而我们今天要用的是 Spring Boot + Spring Security 的组合——这是目前最主流的Java后端开发方式,开箱即即用,配置极少。
二、环境准备(5分钟搞定)
你需要安装:
| 工具 | 版本建议 | 说明 |
|---|---|---|
| JDK | 17 或 11 | Java开发必备 |
| IDE | IntelliJ IDEA(社区版免费) | 写代码的工具 |
| Maven | 内置在IDEA中 | 项目依赖管理工具 |
💡 如果你习惯用Python的pip,可以把Maven理解成Java版的pip,用来下载第三方库(比如Spring Security)。
创建项目(超简单)
- 打开 https://start.spring.io
- 填写如下配置:
Project: Maven
Language: Java
Spring Boot: 3.x(最新稳定版)
Group: com.example
Artifact: security-demo
Dependencies:
- Spring Web
- Spring Security
- 点击 “Generate” 下载 zip 包,解压后用 IDEA 打开。
✅ 避坑提示:一定要勾选
Spring Security!否则后面要手动加依赖,容易出错。
三、核心概念(用生活例子讲清楚)
1. 认证(Authentication) vs 授权(Authorization)
- 认证 = 你是谁?(输入用户名密码登录)
- 授权 = 你能干什么?(普通用户只能看,管理员能删)
🌰 举个栗子:
进公司大楼要刷工牌(认证),进机房还要额外权限(授权)。
2. 用户信息从哪来?
Spring Security 支持多种用户来源:
- 内存(测试用)
- 数据库(正式项目用)
- LDAP / OAuth2(企业级)
我们先用“内存用户”快速跑起来!
3. 安全配置类(SecurityConfig)
这是你控制所有安全规则的地方,相当于“门禁系统的总开关”。
四、实战:5步搭建登录系统
第1步:启动项目,看看默认效果
直接运行 SecurityDemoApplication.java,然后浏览器访问:
http://localhost:8080
你会发现——自动跳转到一个登录页!
🔑 这就是 Spring Security 的魔力:只要引入依赖,就自动开启安全保护!
默认账号密码在哪?
- 用户名:
user - 密码:启动日志里会打印(类似
Using generated security password: abc123...)
第2步:自定义用户名和密码
在 src/main/java/com/example/securitydemo 下新建一个类:
// SecurityConfig.java
package com.example.securitydemo;
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 InMemoryUserDaysManager userDetailsService() {
UserDetails user = User.builder()
.username("admin")
.password("{noop}123456") // {noop} 表示不加密(仅测试用!)
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.anyRequest().authenticated() // 所有请求都要登录
)
.formLogin(form -> form
.loginPage("/login") // 使用默认登录页
.permitAll() // 登录页无需认证
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
}
⚠️ 注意:
{noop}123456中的{noop}表示“明文密码”,生产环境绝对不能这么用!
第3步:创建一个测试接口
新建控制器:
// HelloController.java
package com.example.securitydemo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, you are authenticated!";
}
}
重启项目,访问 /hello,会先跳到登录页。用 admin / 123456 登录后,就能看到成功信息!
第4步:添加“无需登录”的页面
比如首页 / 应该对所有人开放:
// 修改 SecurityConfig 中的 authorizeHttpRequests
.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll() // 首页公开
.anyRequest().authenticated()
)
再加个首页:
@GetMapping("/")
public String home() {
return "Welcome! <a href='/hello'>Go to protected page</a>";
}
第5步:理解“密码加密”(重要!)
上面用 {noop} 是危险的!正确做法是加密:
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.builder()
.username("admin")
.password(passwordEncoder().encode("123456")) // 加密存储
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // 强加密算法
}
✅ 安全最佳实践:永远不要存明文密码!
五、新手常见问题 & 解答
Q1:为什么登录页样式这么丑?
A:这是Spring Security的默认页面。你可以自定义HTML模板(用Thymeleaf或前后端分离)。
Q2:我改了配置,但没生效?
A:检查是否加了 @Configuration 注解,以及方法是否用了 @Bean。
Q3:如何连接数据库?
A:把 InMemoryUserDetailsManager 换成 JdbcUserDetailsManager 或自定义 UserDetailsService。这是下一步要学的内容!
Q4:和Python的Flask-Security比有什么区别?
| 对比项 | Spring Security | Flask-Security |
|---|---|---|
| 学习曲线 | 较陡(Java生态复杂) | 平缓 |
| 功能完整性 | 企业级,功能极全 | 轻量,适合中小型项目 |
| 配置方式 | 注解+Java配置 | 装饰器+配置文件 |
📌 建议:如果你来自Python世界,先理解“认证/授权”概念,再适应Java的配置风格。
六、学习建议 & 下一步
你已经掌握了Spring Security的最核心流程!接下来可以:
- 连接数据库:用MySQL存储用户信息
- JWT认证:适合前后端分离项目(Vue/React + Spring Boot)
- 角色权限控制:比如
.hasRole("ADMIN") - OAuth2集成:支持微信/Google一键登录
💬 我的经验之谈:
不要一开始就啃官方文档!先跑通一个例子,再逐步深入。我在B站的【Spring Security实战系列】视频里,会一步步带你做完整项目,欢迎关注!
结语
Spring Security看起来复杂,其实核心就三件事:
- 谁可以访问什么?(授权)
- 怎么证明你是你?(认证)
- 密码怎么安全存储?(加密)
只要你理解这三点,就已经超过80%的初学者了!
动手试试吧!遇到问题欢迎在评论区留言,我会一一解答。下期我们讲《Spring Security + JWT 实现无状态登录》,记得点赞收藏!
作者:小码哥(B站技术UP主)
专注:Spring Boot / 微服务 / 分布式系统
口号:让技术不再高冷!

评论 0