Spring Security基础:快速搭建安全认证系统(零基础入门教程)

写代码的普通人
2025-12-14 00:25
阅读 717

大家好,我是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)。

创建项目(超简单)

  1. 打开 https://start.spring.io
  2. 填写如下配置:
Project: Maven
Language: Java
Spring Boot: 3.x(最新稳定版)
Group: com.example
Artifact: security-demo
Dependencies: 
  - Spring Web
  - Spring Security
  1. 点击 “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的最核心流程!接下来可以:

  1. 连接数据库:用MySQL存储用户信息
  2. JWT认证:适合前后端分离项目(Vue/React + Spring Boot)
  3. 角色权限控制:比如 .hasRole("ADMIN")
  4. OAuth2集成:支持微信/Google一键登录

💬 我的经验之谈
不要一开始就啃官方文档!先跑通一个例子,再逐步深入。我在B站的【Spring Security实战系列】视频里,会一步步带你做完整项目,欢迎关注!


结语

Spring Security看起来复杂,其实核心就三件事:

  1. 谁可以访问什么?(授权)
  2. 怎么证明你是你?(认证)
  3. 密码怎么安全存储?(加密)

只要你理解这三点,就已经超过80%的初学者了!

动手试试吧!遇到问题欢迎在评论区留言,我会一一解答。下期我们讲《Spring Security + JWT 实现无状态登录》,记得点赞收藏!

作者:小码哥(B站技术UP主)
专注:Spring Boot / 微服务 / 分布式系统
口号:让技术不再高冷!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝