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

远方的接口
2025-06-19 04:03
阅读 241

开篇:Spring Security 是什么?

开篇:Spring Security 是什么?

你可能已经听说过“登录”、“权限控制”这样的词语。比如,你在网站上输入账号密码后才能访问某些页面,这就是所谓的“安全控制”。

Spring Security 就是 Java 世界中一个非常常用的、用来做安全控制的框架。它可以:

  • 控制谁能登录你的系统;
  • 判断用户有没有权限访问某个功能;
  • 管理用户的角色(比如普通用户、管理员等);

它就像是一把“门锁”,帮你保护你开发的应用程序。

本教程适合完全没有接触过 Spring Security 的初学者。我们会从零开始,通过一个小项目带你认识它的基本用法。


环境准备:你需要安装哪些东西?

数据库设计模型-1

环境准备:你需要安装哪些东西?

在开始之前,先准备好开发环境:

1. 安装 JDK(Java Development Kit)

推荐使用 JDK 8 或以上版本。你可以去官网 Oracle JDK 或者 OpenJDK(如 Adoptium)下载安装。

安装完成后,在命令行中执行:

java -version

确保能输出类似如下内容:

openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment ...

2. 安装 IDE(推荐 IntelliJ IDEA)

IntelliJ IDEA 是一个非常适合 Java 开发的编辑器。我们建议选择 Community 版本,它是免费的。

下载地址:JetBrains IntelliJ IDEA 下载页

3. 创建一个 Spring Boot 项目

访问 Spring Initializr 创建一个新的 Spring Boot 项目:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 2.x 或 3.x 都可以(根据你的 JDK 来定)
  • Dependencies:
    • Spring Web
    • Spring Security

点击 “Generate” 下载压缩包,解压并导入到 IntelliJ IDEA 中。

这样我们就有了最基本的开发环境啦!


核心概念:Spring Security 关键术语解释

我们来了解几个最常见的概念,用生活中的例子类比说明:

技术术语 生活比喻 含义
用户(User) 公司员工 访问系统的个体
登录(Login) 刷门禁卡进入公司 提供身份凭证的过程
角色(Role) 职位,比如普通员工、经理 表示权限范围
权限(Authority) 允许访问某些资源,比如查看报表、发布文章 更细粒度的权限控制
安全配置(Security Config) 公司保安制定的规则手册 通过代码定义如何控制权限

这些概念会在下面的实战中一一出现。


实战项目:做一个登录 + 权限控制的小系统

我们将创建一个简单的 Web 应用,实现以下功能:

  • 有两个用户:user 和 admin
  • user 只能访问 /hello 页面
  • admin 可以访问 /hello/admin

第一步:添加依赖

我们在 pom.xml 文件中已经加入了 Spring Security 的依赖,如果你没加,请补上:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

保存后会自动下载所需库。

第二步:创建控制器 Controller

新建一个 Java 类,命名为 HelloController.java

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

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "你好,这里是公开信息";
    }

    @GetMapping("/admin")
    public String admin() {
        return "欢迎管理员!这里是高级区域";
    }
}

现在运行程序,默认端口是 8080。你访问 http://localhost:8080/hello 会发现弹出一个登录界面,这是 Spring Security 默认提供的功能。

默认用户名是 user,密码在启动时会在控制台打印出来:

Using generated security password: abcd1234

尝试用这个用户名和密码登录。

第三步:配置用户信息

默认是随机生成一个用户。我们来自己配置两个用户:user 和 admin。

新建一个 Java 类,命名为 SecurityConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;


![数据流转过程-2](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025061904/fc6dc721-a4d5-41de-84d1-044bf8974095.jpg)


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 配置内存中的用户信息
        auth.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("123")).roles("USER")
            .and()
            .withUser("admin").password(passwordEncoder().encode("123")).roles("ADMIN");
    }

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/hello").hasAnyRole("USER", "ADMIN") // 所有用户都能访问
                .antMatchers("/admin").hasRole("ADMIN")         // 仅管理员可访问
                .anyRequest().authenticated()
            .and()
            .formLogin() // 使用默认登录表单
            .and()
            .logout().permitAll();
    }
}

这段代码做了几件事情:

  • 设置了两个用户:user 和 admin,各自有不同的角色
  • 给不同的 URL 设置访问权限
  • 使用表单登录方式
  • 对密码进行了加密处理(使用 BCryptPasswordEncoder

第四步:测试不同用户访问权限

重启项目后:

  • 用 user 用户登录(密码 123),访问:
    • 成功打开 /hello
    • 访问 /admin 会出现 “Forbidden” 错误
  • 用 admin 用户登录(密码 123),访问:
    • /hello OK
    • /admin 也能正常访问

恭喜!你已经完成了一个基本的安全控制系统!


常见问题解答(FAQ)

问题 1:我启动后不知道默认密码在哪看?

答:请仔细检查控制台输出,你会看到一行类似:

Using generated security password: abcdefg123456

那就是自动生成的默认密码。不过,建议像我们上面一样自定义账户更方便管理。


问题 2:为什么我设置了用户但总是登录失败?

答:请确认你是否正确地给密码用了加密方法。例如:

错误写法:

.withUser("user").password("123").roles("USER")

正确写法:

.withUser("user").password(passwordEncoder().encode("123")).roles("USER")

如果你漏掉了 .encode(),就会永远登不进去。


问题 3:我能自定义登录页面吗?

当然可以!我们只是用了默认的登录页。要替换为你自己的 HTML 页面,需要在配置中加上:

.formLogin().loginPage("/my-login") // 自定义登录页面路径

然后编写一个 Controller 返回 HTML 页面即可。


问题 4:如何退出登录?

只要访问 /logout 即可。Spring Security 默认开启了退出接口。你可以自己写个链接或按钮触发。


学习建议:下一步怎么学?

你已经完成了基础部分的学习,可以继续深入学习以下几个方向:

✅ 推荐学习路线

学习阶段 推荐内容
第一阶段(入门) 本文内容已覆盖
第二阶段(进阶) 自定义登录页面、记住我、CSRF防护、RBAC权限设计
第三阶段(数据库集成) 集成 MySQL,将用户信息存在数据库中
第四阶段(OAuth2 / JWT) 学习基于令牌的身份验证,如用于前后端分离、微服务场景

🔍 推荐学习资源


结语

这篇教程只是一个起点,Spring Security 的功能远不止这些。但它足够让你跨过那道门槛,迈出第一步。

记住一句话:安全是每个应用的基础,而 Spring Security 是 Java 工程师必备的技能之一。

只要你坚持边学边练,相信很快就能掌握这个强大的工具!

如果你喜欢这种实践导向的风格,也欢迎关注更多后续的 Spring 系列教程 😊

评论 0

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