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

邓强
2025-06-26 04:14
阅读 264

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

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

如果你刚开始学习Java后端开发,你可能已经听说过Spring这个框架。而Spring Security是Spring家族中的一个重要组件,专门用来为我们的Web应用添加“安全防护”。你可以把它想象成给你的网站加了一扇门,这扇门只允许拥有合法“钥匙”(比如用户名和密码)的人进入。

简单来说,Spring Security可以帮你实现用户登录、权限控制、数据加密等功能。无论是做后台管理系统、电商网站还是社交平台,只要涉及用户的登录和权限管理,都需要用到它。

本教程将从零开始,带你一步步搭建一个带有基本安全认证功能的小项目,即使你是编程小白,也能轻松上手!


环境准备:搭建开发环境

环境准备:搭建开发环境

在正式开始之前,我们需要准备好开发所需的工具和环境。以下是推荐的软件组合:

1. Java环境

确保你已经安装了Java 17或更高版本。可以通过命令行输入以下命令检查是否安装成功:

java -version

如果没装Java,请前往Oracle官网下载安装。

2. Maven构建工具

Maven是一个用来管理项目依赖(即第三方库)的工具,我们会在后续使用它来引入Spring Security相关库。

检查是否安装Maven:

mvn -v

没有的话可以从Maven官网下载并安装。

3. IDE(集成开发环境)

建议使用IntelliJ IDEA Community Edition(免费),它对Spring Boot的支持非常友好。当然,Eclipse也是可行的替代方案。

提示:IDEA社区版足够用于本教程的所有练习。

4. 创建一个Spring Boot项目

访问 https://start.spring.io,按照以下配置生成一个基础Spring Boot项目:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 3.x(例如3.1.0)
  • Group: com.example
  • Artifact: secure-demo
  • Dependencies:
    • Spring Web
    • Spring Security

点击 Generate 下载项目压缩包,并解压到本地文件夹中。

使用IDE导入项目,打开后你会看到标准的Spring Boot结构,类似这样:

src/
├── main/
│   ├── java/
│   │   └── com.example.securedemo/
│   │       ├── DemoApplication.java
│   │       └── controller/ (你可以在这里写控制器类)
│   └── resources/
│       └── application.properties

此时你就可以运行 DemoApplication 启动Spring Boot项目了,默认启动端口是8080。


核心概念:通俗讲解关键术语

在真正动手编码之前,先理解几个Spring Security中最核心的概念。

服务器部署方案-2

1. 用户(User)

指需要登录系统的普通用户。通常会存储他们的用户名和密码。

2. 认证(Authentication)

就是“验证用户身份”的过程。就像你在银行ATM取钱时插卡输密码的过程。

3. 授权(Authorization)

是指确定某个已登录用户能做什么事。比如管理员能看到所有内容,普通用户只能看到一部分。

4. 角色(Role)

角色是权限的一种分类方式。常见的有:ROLE_USER、ROLE_ADMIN等。

5. 安全策略(Security Config)

这部分是你编写规则的地方,用来告诉Spring Security:“哪些页面需要登录?哪些角色能访问哪些资源?”

这些概念听起来有点抽象,没关系!下面我们会通过具体例子逐步解释。


实战项目:跟着教程完成第一个安全系统

我们将创建一个简单的Spring Boot项目,实现以下功能:

  • 用户访问 /hello 页面,只有登录后才能查看
  • 使用内存中的默认用户进行测试

第一步:添加Spring Security依赖

如果你是通过上面的方法用start.spring.io生成的项目,那Spring Security已经自动添加了依赖。

如果没有,请手动添加如下Maven依赖到 pom.xml 文件中:

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

保存后IDE会自动下载相关包。

第二步:编写一个简单的页面控制器

新建一个控制器类:HelloController.java,内容如下:

package com.example.securedemo.controller;

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

@RestController
public class HelloController {
    
    @GetMapping("/hello")
    public String sayHello() {
        return "欢迎来到安全世界!";
    }
}

运行项目后,在浏览器中访问 http://localhost:8080/hello
你会发现页面自动跳转到了一个登录界面。

这是Spring Security自动为我们加上了保护机制——说明它已经生效了!

但这时还没有设置登录账号,Spring Security会自动生成一个默认的临时用户名密码,我们可以在控制台看到:

Using generated security password: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

记住这个密码,稍后再尝试登录。

第三步:配置自定义用户名密码(内存模式)

为了方便演示,我们可以直接在配置文件中定义一个用户。

修改 application.properties 文件,添加以下内容:

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

重启项目,再次访问 /hello 页面,输入用户名 admin,密码 123456 即可成功访问。

⚠️ 注意:这种方式仅适用于测试,不适合生产环境。

第四步:配置访问权限

目前我们只是保护了整个项目的所有接口,我们希望更精细地控制。

例如,只有ADMIN角色的用户才可以访问 /admin 路径,而其他用户不能访问。

为此,我们需要编写一个配置类。

新建类 SecurityConfig.java

package com.example.securedemo.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.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    // 配置两个用户,user 和 admin
    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("123456")
                .roles("USER")
                .build();

        UserDetails admin = User.withDefaultPasswordEncoder()
                .username("admin")
                .password("admin123")
                .roles("ADMIN", "USER") // 拥有两个角色
                .build();


![系统架构设计图-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025062604/4f3e3db7-d889-4137-958f-3685a5a3be61.jpg)


        return new InMemoryUserDetailsManager(user, admin);
    }

    // 配置安全策略
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/hello").hasRole("USER")
                .requestMatchers("/admin").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/login") // 可自定义登录页,这里暂不深入
                .permitAll()
            )
            .logout(logout -> logout.permitAll());

        return http.build();
    }
}

现在重新启动项目,尝试访问:

登录测试账户:

  • 普通用户:user / 123456
  • 管理员:admin / admin123

你可以观察不同用户对不同路径的访问结果。

✅ 成果达成:你已经搭建了一个带有登录和权限控制的完整安全系统!


常见问题解答

作为刚入门的新手,你可能会遇到以下一些常见问题,下面我们一一解答:

Q1:为什么我在访问任何页面都跳转到登录页?

A:因为你开启了Spring Security,它默认会对所有请求进行安全控制。除非你显式允许某些路径(如静态资源),否则都需要登录访问。

Q2:为什么我不能登录?输入正确的账号密码也不行?

A:请检查你是否清除了缓存浏览器中的旧Cookie,或者有没有拼写错误。另外,密码是否匹配也需确认。

Q3:如何退出当前登录状态?

A:Spring Security自动提供了一个 /logout 路径,访问该路径即可退出登录。

Q4:我可以把用户信息存在数据库中吗?

A:当然可以!我们这里是用内存模拟用户数据,下一阶段就可以连接MySQL或PostgreSQL等数据库进行持久化存储。


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

恭喜你完成了第一个基于Spring Security的安全系统!接下来你可以朝着以下几个方向继续学习:

1. 进阶主题:

  • 数据库用户认证(JDBC、MyBatis、JPA)
  • JWT令牌认证(常用于前后端分离项目)
  • OAuth2第三方登录(如微信、QQ登录)
  • RBAC权限模型设计与实现

2. 推荐学习顺序:

  • 先掌握Spring Boot基础知识
  • 掌握Thymeleaf模板引擎(如果想定制登录页面)
  • 学习RESTful API设计,结合Spring Security实现无状态认证
  • 尝试Spring Security + Vue.js前后端分离项目实战

3. 推荐资料:


总结

本教程从零开始,一步步教你搭建一个基于Spring Security的基础安全系统:

  • 介绍了Spring Security的作用和应用场景
  • 搭建了基本的开发环境
  • 解释了认证、授权、角色等关键概念
  • 通过实战代码实现了页面访问控制和权限分级
  • 回答了一些初学者常见问题
  • 提供了进一步学习的方向

只要你坚持动手实践,相信很快就能掌握这一关键技术,并在真实项目中灵活运用!


加油!祝你早日成为安全领域的“守门人”!🔒

评论 0

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