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

接口调不通
2025-06-24 07:19
阅读 306

开篇:Spring Security 是什么?能做什么?

开篇:Spring Security 是什么?能做什么?

在现代的 Web 应用中,安全性是非常重要的一环。无论是登录功能、权限控制还是防止恶意访问,都需要通过某种机制来保障系统的安全。

Spring Security 就是一个专门用来处理这些安全问题的框架。它可以帮助我们:

  • 让用户登录系统
  • 控制不同用户的访问权限
  • 加密用户密码
  • 防止常见的攻击(如 CSRF)

简单来说,Spring Security 就是给你的 Spring 项目加一道“门卫”,只有满足条件的人才能进入特定区域。

这篇文章将从零开始,一步步带你快速搭建一个最简单的安全认证系统,适合完全没接触过 Spring Security 的初学者!


环境准备:搭建开发环境

缓存策略对比-1

环境准备:搭建开发环境

要使用 Spring Security,我们需要先准备好一个开发环境。

所需工具

  1. JDK 8 或以上版本
  2. IDE:推荐 IntelliJ IDEA(社区版即可)
  3. Maven 或 Gradle 构建工具
  4. 浏览器

创建 Spring Boot 项目

我们使用 https://start.spring.io 快速创建一个 Spring Boot 项目:

  1. 打开网页 https://start.spring.io

  2. 选择以下选项:

    • Project: Maven
    • Language: Java
    • Spring Boot Version: 推荐 2.x 以上
    • Group: com.example
    • Artifact: spring-security-demo
    • Dependencies: 添加两个:
      • Spring Web
      • Spring Security
  3. 点击 “Generate” 下载项目压缩包。

  4. 解压后,用 IntelliJ IDEA 导入为 Maven 项目。

✅ 至此,你的开发环境就准备好了!


核心概念:你需要知道的几个关键词

虽然你还不懂 Spring Security,但只需要记住以下几个核心概念就可以轻松上手了。

1. 用户(User)

就是访问系统的普通人,通常需要提供用户名和密码才能登录。

2. 权限(Authority / Role)

用户拥有不同的“身份”,比如管理员、普通用户。不同身份可以访问不同的资源。

3. 登录(Authentication)

验证用户是否合法的过程,比如输入用户名和密码。

4. 授权(Authorization)

确定已登录的用户能访问哪些内容。

5. 安全配置(SecurityConfig)

是我们自己写的一个配置类,告诉 Spring Security 怎么保护网站。

📌 简单记忆口诀:认证是“你是谁”,授权是“你能做什么”。


实战项目:一步步实现一个简单的登录系统

现在我们来做一个最简单的安全认证系统,包括:

  • 提供默认登录页面
  • 设置一个测试账号
  • 对 /admin 页面做权限限制

步骤一:添加测试账号

Spring Security 默认会帮我们生成一个临时用户,但我们也可以自己定义用户名和密码。

打开 application.properties 文件(如果没有,请在 resources 下新建),添加如下内容:

spring.security.user.name=admin
spring.security.user.password=123456

这样我们就有了一个用户名为 admin、密码为 123456 的测试用户。

💡新手提醒:密码不要写明文!后面我们会学到加密的方法。

步骤二:启动项目看看效果

运行你的 Spring Boot 项目,等服务启动完成后,在浏览器中访问任意路径(例如:http://localhost:8080/hello),你会被自动重定向到 /login 页面。

你会看到一个 Spring Security 提供的默认登录界面,输入刚才设置的账号密码试试看。

✅ 成功登录说明认证已经生效!

步骤三:自定义权限规则

现在我们要让 /admin 这个页面只能由管理员访问。

首先创建一个控制器类:

HomeController.java

package com.example.springsecuritydemo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "欢迎来到首页!";
    }

    @GetMapping("/admin")
    public String admin() {
        return "这是管理员页面!";
    }
}

此时,所有登录用户都可以访问 /admin。我们希望只有角色为 ADMIN 的用户才有权限。

步骤四:编写安全配置类

创建一个新的类:

SecurityConfig.java

package com.example.springsecuritydemo;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
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;


![负载均衡配置-2](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025062407/4c6d03ad-a5c7-4a1e-8ead-6700188c43bf.jpg)


@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public InMemoryUserDetailsManager users() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("123456")
            .roles("USER")
            .build();

        UserDetails admin = User.withDefaultPasswordEncoder()
            .username("admin")
            .password("123456")
            .roles("ADMIN")
            .build();

        return new InMemoryUserDetailsManager(user, admin);
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/admin").hasRole("ADMIN")
                .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .logout();
        return http.build();
    }
}

✅ 解释一下这个配置的作用:

  • 我们手动设置了两个用户:user 和 admin,分别对应 USER 和 ADMIN 角色。
  • 配置了访问规则:
    • / 谁都可以访问;
    • /admin 只有 ADMIN 角色才能访问;
    • 其他任何页面都要登录才可以访问;
  • 启用了表单登录(也就是弹出登录页)和退出功能。

再次运行项目,尝试访问 /admin 页面,你会发现:

  • 使用 username=user 登录 → 被拒绝;
  • 使用 username=admin 登录 → 成功访问!

🎉 到这里为止,我们的第一个带权限的 Spring Security 项目就完成啦!


常见问题解答

Q1:为什么我修改了密码但无法登录?

A:确保你在 application.properties 中设置的账号与我们在 SecurityConfig 中定义的不冲突。如果你用了自定义用户管理类,那么 application.properties 里的设置会被忽略。

Q2:密码明文存储危险怎么办?

A:本教程为了方便演示用了明文密码。在实际开发中请使用 BCryptPasswordEncoder 加密密码,后续我们可以学习如何集成更安全的密码管理方式。

Q3:登录页面太丑能不能自定义?

A:当然可以!你可以使用 Thymeleaf 模板或直接返回 HTML,设计自己的登录页面。我们会在下一阶段讲到。

Q4:我想让用户不用登录就能访问某些接口,怎么配置?

A:使用 .antMatchers("/api/public").permitAll() 即可。


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

恭喜你完成了本教程的学习!接下来如果你想继续深入 Spring Security,可以考虑学习以下方向:

  1. 自定义登录页面
  2. 使用数据库管理用户信息(如 MySQL + JPA)
  3. JWT 认证机制
  4. RBAC 权限模型实战
  5. 与 OAuth2、SSO 结合使用

📚 推荐资料:


结语

Spring Security 虽然听起来很高深,但只要理解了它的基本思想,并动手实践几次,就能掌握它的核心用法。希望这篇教程帮你迈出了第一步!

如果你喜欢这种风格的教学,请告诉我,我可以继续为你带来更多通俗易懂的后端技术入门教程 😊

评论 0

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