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

一颗后端星球
2025-06-13 05:29
阅读 565

开篇:Spring Security是什么,用来做什么?

开篇:Spring Security是什么,用来做什么?

在开发 Web 应用时,我们常常需要保护某些页面或接口,比如用户中心、后台管理等,只允许特定的用户访问。这时候我们就需要用到一个功能强大的安全框架——Spring Security

简单来说:

Spring Security 是一个基于 Java 的安全框架,主要用于控制用户访问权限、处理登录验证、实现角色控制等功能。

你可能听说过“登录注册”、“权限控制”这些概念,Spring Security 就是用来实现这些功能的工具包。

本教程将从零开始,带着你一步步使用 Spring Security 搭建一个最简单的安全认证系统,让你理解基本的流程和原理。


环境准备:开发环境搭建

环境准备:开发环境搭建

1. 软件要求

请确保你已经安装以下软件:

  • Java 8 或以上版本(推荐 JDK 17)
  • Maven 构建工具(自动依赖管理)
  • IDE:IntelliJ IDEA / Eclipse / VS Code(推荐 IntelliJ IDEA)
  • 浏览器(Chrome/Firefox)

可以通过终端输入以下命令检查版本:

java -version
mvn -v

2. 创建 Spring Boot 项目

打开 https://start.spring.io,进行如下配置:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 3.x(建议使用最新稳定版)
  • Group: com.example
  • Artifact: spring-security-demo
  • Dependencies:
    • Spring Web
    • Spring Security

点击 Generate 下载压缩包,解压后导入你的 IDE 中运行。

3. 启动项目

进入主类 SpringSecurityDemoApplication.java,运行它。默认端口是 8080,浏览器访问:

http://localhost:8080

不出意外你会看到一个 404 错误,说明服务启动成功了,但我们还没有写页面。


核心概念:通俗易懂地讲清楚几个关键点

核心概念:通俗易懂地讲清楚几个关键点

服务器部署方案-2

在实际开发前,先了解几个非常重要的 Spring Security 概念,它们是构建安全系统的基石。

1. 认证(Authentication)

就是判断你是谁的过程。比如输入用户名和密码登录系统,这个过程就叫做认证。

你可以把认证想成进电影院之前要刷身份证——看你是不是买票的人。

2. 授权(Authorization)

认证通过之后,还要看你有没有权限做某件事。比如普通用户不能删除文章,管理员才可以。

授权就是判断你能干什么事。

3. 用户(User)与角色(Role)

用户是你网站上的访客或者注册用户。

角色是对用户分组的一种方式。常见角色有:ROLE_USERROLE_ADMIN

例如:

  • Alice 是用户,属于 ROLE_USER
  • Bob 是用户,属于 ROLE_ADMIN

4. 安全过滤器链(Filter Chain)

Spring Security 使用一系列过滤器来拦截请求,根据规则决定是否放行请求。

可以理解为层层关卡,每一道门都会检查一次权限。


实战项目:一步步构建第一个安全系统

系统架构设计图-1

实战项目:一步步构建第一个安全系统

我们将完成以下几个目标:

  • 创建一个主页 /,所有人都能访问
  • 创建一个受保护页面 /admin,只有登录后的管理员才能访问
  • 使用内存中的两个用户测试登录

第一步:创建控制器 Controller

src/main/java/com/example/springsecuritydemo/controller 目录下创建 HomeController.java

package com.example.springsecuritydemo.controller;

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 "欢迎来到管理员页面!只有管理员能看到哦~";
    }
}

现在再次启动项目,在浏览器访问:

因为我们还没有添加任何安全控制。

第二步:配置安全规则

我们需要告诉 Spring Security 哪些页面需要保护。

新建文件:SecurityConfig.java

位置:src/main/java/com/example/springsecuritydemo/config/SecurityConfig.java

package com.example.springsecuritydemo.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.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("/").permitAll()
                .requestMatchers("/admin").authenticated()
            )
            .formLogin(form -> form
                .loginPage("/login") // 登录页
                .permitAll()
            );

        return http.build();
    }

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

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

        return new InMemoryUserDetailsManager(user, admin);
    }
}

上面代码的作用:

  • 配置哪些路径需要认证访问
  • 设置登录页面地址 /login
  • 创建两个内存用户(用于测试)

注意:这里只是演示用途,生产环境中不会明文保存密码。

第三步:添加登录页面

虽然我们没有自己写登录页面,但 Spring Security 会自动提供一个简单的登录界面。

你现在访问:http://localhost:8080/admin
会自动跳转到登录页面,你可以尝试用之前设置的用户名登录:

  • username: user / password: 123456 → 可以登录,但是无法访问 /admin
  • username: admin / password: admin123 → 登录后可以访问 /admin

因为我们在配置中设置了:

.requestMatchers("/admin").authenticated()

意思是只要登录就能访问。那我们能不能进一步控制只能管理员访问呢?当然可以!

第四步:按角色限制访问权限

修改 SecurityConfig.java 中的 securityFilterChain 方法:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/").permitAll()
            .requestMatchers("/admin").hasRole("ADMIN")
        )
        .formLogin(form -> form
            .loginPage("/login")
            .permitAll()
        );

    return http.build();
}

此时再尝试用普通用户登录并访问 /admin,你会看到错误页面提示“Forbidden”,说明权限校验已生效。


常见问题解答

以下是新手学习过程中容易遇到的问题,以及解决办法。

Q1:为什么我访问 /admin 不弹出登录页,而是直接返回403?

答: 说明你已经登录过,并且当前登录用户没有权限访问该页面。可以尝试清除 Cookie 或更换浏览器隐私窗口重新访问。

Q2:为什么我配置的角色加了 “ROLE_” 前缀?

答: Spring Security 对角色有一个隐式约定,会自动加上 ROLE_ 前缀。你在 .roles("ADMIN") 中只需要写 ADMIN,Spring 会识别为 ROLE_ADMIN

Q3:怎么查看当前登录用户信息?

你可以修改控制器方法,这样显示当前用户信息:

@GetMapping("/whoami")
public String whoAmI(Principal principal) {
    if (principal == null) {
        return "未登录";
    }
    return "当前登录用户:" + principal.getName();
}

Q4:密码明文存储是不是很危险?

答: 是的。目前我们用了 .withDefaultPasswordEncoder() 来方便演示,但在正式开发中应该使用更强的加密算法,如 BCrypt。


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

恭喜你完成了你的第一个 Spring Security 小项目!

接下来你可以沿着这些方向继续深入:

1. 进阶学习内容

方向 内容
数据库用户管理 把用户信息存入数据库(如 MySQL),而不是内存
自定义登录页面 使用 Thymeleaf 编写自己的登录 HTML 页面
OAuth2 登录 支持微信、QQ、GitHub 等第三方登录
JWT Token 实现无状态的身份验证
动态权限控制 更灵活的权限分配机制

2. 工具推荐

3. 实战小项目建议

试着做一个拥有以下功能的小型管理系统:

  • 注册登录功能
  • 用户主页(只能自己访问)
  • 管理员后台(仅 ROLE_ADMIN 可访问)
  • 角色管理模块(给用户分配不同角色)

总结

本文是一个完全面向零基础的学习指南,带你认识了 Spring Security 的基本用法,并亲手实践了一个简单的安全认证系统。主要内容包括:

  • 认识 Spring Security 是做什么的
  • 快速搭建 Spring Boot + Security 项目
  • 理解认证、授权、用户、角色等核心概念
  • 完成了一个包含登录和权限控制的实战项目
  • 解决了新手常见的一些疑问

希望你能够通过这篇教程迈入安全编程的大门,在未来的项目中更安心地实现用户管理和权限控制功能。

如果你觉得这篇文章对你有帮助,别忘了点赞分享哟~ 🎉


继续加油!安全的世界很广阔,也充满挑战!

评论 0

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