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

完美探险家
2025-06-29 14:34
阅读 429

开篇:什么是Spring Security?

开篇:什么是Spring Security?

你有没有想过,为什么我们在访问一些网站或系统的时候需要登录?为什么有的页面你没登录就看不到?背后其实有一套机制来保护这些资源——这正是我们今天要学的 Spring Security 所做的事情。

简单来说,Spring Security 是一个专门为 Java 应用程序设计的安全框架,它可以让我们很方便地实现用户登录、权限控制、访问限制等安全功能。不管你开发的是一个前后端分离的 Web 系统,还是一个 REST API 接口服务,Spring Security 都可以帮助你构建出一个安全可靠的后台系统。

而本文的目标就是,带你从零开始,一步步搭建一个带有“登录”和“权限控制”的简单 Spring Boot 项目,帮助你理解 Spring Security 的基本使用方式。


第一步:环境准备

系统架构设计图-1

第一步:环境准备

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 使用一组过滤器对请求进行安全处理,每个请求都要经过多个“安全关卡”,比如登录拦截、权限判断等。


实战项目:快速实现登录与权限管理

我们现在来一步一步做一个小项目:

目标是:

  1. 创建两个用户:张三(普通用户)、李四(管理员)
  2. 普通用户只能访问 /user/** 路由
  3. 管理员能访问 /admin/**/user/** 路由
  4. 未登录用户无法访问任何受保护页面,会被跳转到登录页

第一步:添加用户配置

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),然后尝试访问:

系统会自动跳转到登录页面,输入用户名密码(如 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,使用 JDBCSpring 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

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