Spring Security基础:快速搭建安全认证系统

开发者小宇宙
2025-06-16 07:26
阅读 292

开篇:Spring Security是什么?它能帮我们做什么?

开篇:Spring Security是什么?它能帮我们做什么?

Spring Security 是一个基于 Java 的安全框架,主要用于在 Web 应用程序中实现用户登录、权限控制等安全管理功能。你可以把它理解为给你的网站“加锁”的工具。

比如说你想做一个博客网站:

  • 只有注册用户才能发表文章
  • 普通用户只能查看文章
  • 管理员可以删除评论

这些权限管理的工作,都可以通过 Spring Security 快速实现。

环境准备:搭建开发环境

环境准备:搭建开发环境

为了使用 Spring Security,我们需要准备好以下开发环境:

1. 安装 JDK(Java 开发工具包)

推荐安装版本:JDK 8 或以上
下载地址:https://www.oracle.com/java/technologies/javase-downloads.html

安装完成后,打开命令行输入:

java -version

如果有类似如下输出,说明安装成功:

openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment Zulu17.34+19-CA (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM Zulu17.34+19-CA (build 17.0.1+12-LTS, mixed mode)

2. 安装 IntelliJ IDEA(IDE)

推荐使用社区版(免费):
下载地址:https://www.jetbrains.com/idea/download/

3. 创建 Spring Boot 项目

访问 https://start.spring.io/ 创建一个新的 Spring Boot 项目:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 最新稳定版
  • Dependencies: Spring Web + Spring Security

点击 “Generate” 下载生成的项目压缩包。

解压后,用 IntelliJ 打开该项目即可开始编码。


核心概念:Spring Security 中的关键角色

核心概念:Spring Security 中的关键角色

学习任何一个框架,先了解几个核心概念很重要。

概念 解释
UserDetails 描述用户的详细信息,比如用户名、密码、角色等
Authentication 表示一个认证对象,包含当前登录的用户信息
SecurityFilterChain 过滤器链,用于拦截请求并进行安全控制
Role / Authority 角色与权限的区别:角色是分类,权限是具体操作

小贴士:可以把 Role 理解成“职位”,Authority 是“权利”


实战项目:构建一个简单的登录认证系统

我们来一步一步地搭建一个支持登录验证的 Web 系统。最终效果是:

  • 未登录用户只能访问 /hello 页面
  • 登录后可以访问 /secure 页面

第一步:添加依赖

确保 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>

保存后,IDEA 会自动下载相关 jar 包。

第二步:创建控制器类

新建 HelloController.java

import org.springframework.web.bind.annotation.*;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "大家好!欢迎来到安全世界";
    }

    @GetMapping("/secure")
    public String secure() {
        return "这是受保护的页面,请登录后再查看";
    }
}

此时启动应用,访问 /secure 会被强制跳转到登录页(由 Spring Security 自动生成)。

默认用户名和密码会在控制台打印出来(例如:user / 123456),你也可以自定义账号信息。

第三步:配置安全策略(重点)

新建一个配置类 SecurityConfig.java

import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.web.builders.*;
import org.springframework.security.config.annotation.web.configuration.*;
import org.springframework.security.core.userdetails.*;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    // 设置内存中的用户
    @Bean
    public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
        UserDetails user = User.builder()
            .username("user")
            .password(passwordEncoder.encode("123"))
            .roles("USER") // 角色
            .build();
        
        UserDetails admin = User.builder()
            .username("admin")
            .password(passwordEncoder.encode("123"))
            .roles("ADMIN")
            .build();

        return new InMemoryUserDetailsManager(user, admin);
    }

    // 配置安全规则
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/hello").permitAll()   // 允许所有人访问
                .requestMatchers("/secure").authenticated() // 认证后才能访问
            )
            .formLogin(withDefaults()); // 启用默认表单登录页面
        return http.build();
    }

    // 密码加密方式
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

这段代码做了三件事:

  • 在内存中定义了两个用户:user 和 admin
  • 配置了哪些路径需要认证,哪些不需要
  • 使用 BCrypt 加密方式存储密码(更安全)

第四步:运行测试

启动应用后,在浏览器中访问:

  1. http://localhost:8080/hello —— 不用登录也能访问 ✅
  2. http://localhost:8080/secure —— 自动跳转到登录页 ➕ 输入用户名密码后访问 ✅

常见问题:新手遇到的问题及解决方案

❓1. 为什么我设置了用户,但还是无法登录?

可能原因:

  • 用户名或密码拼写错误(区分大小写)
  • 角色没有正确配置
  • 没有启用 formLogin() 方法

建议检查日志输出,看是否有“Authentication failed”之类的提示。

❓2. 怎么关闭 CSRF 保护?开发时总报错。

Spring Security 默认启用 CSRF 保护机制。如果你在测试阶段想临时禁用:

.csrf(csrf -> csrf.disable())

注意:这只是为了测试,不要在生产环境中关闭!

❓3. 可以不弹出登录页面吗?

可以换成 REST 接口登录。我们可以通过自定义登录逻辑来实现无页面登录(进阶内容),后面可以继续学习 JWT、OAuth2 等方式。


学习建议:下一步该学什么?

恭喜你完成了第一个安全系统的搭建!

接下来你可以尝试:

  • 把用户信息存入数据库(MySQL、PostgreSQL)
  • 使用 JWT 实现无状态认证
  • 添加角色权限控制
  • 对接 OAuth2 第三方登录(如 GitHub、微信)

Spring Security 是个庞大而强大的工具包,但只要你从最简单的例子入手,逐步深入,就一定能掌握它的精髓。


希望这篇教程对你理解 Spring Security 有所帮助!下一站目标:搭建完整的用户权限系统 🚀

评论 0

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