跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

Spring Boot 安全认证与授权详解

解析 Spring Boot 集成 Spring Security 的核心流程,涵盖内存与数据库认证、基于角色与权限的授权配置,以及登录登出等实际场景的实现细节。通过代码示例展示如何快速构建安全应用,解决用户身份验证与资源访问控制问题。

DevStack发布于 2026/3/15更新于 2026/5/85 浏览
Spring Boot 安全认证与授权详解

Spring Boot 安全认证与授权

架构图

学习目标

本章将深入讲解 Spring Boot 如何集成 Spring Security,涵盖核心概念、配置方法、认证授权机制以及实际应用场景。重点掌握内存与数据库认证、基于角色和权限的访问控制,以及如何构建安全的登录登出流程。

Spring Security 概述

Spring Security 是 Java 生态中最主流的安全框架之一。它提供了全面的安全功能,包括用户认证(Authentication)和用户授权(Authorization),并支持与其他 Spring 组件无缝整合。相比 Shiro 等其他框架,Spring Security 在可扩展性和与 Spring 生态的整合性上表现更为出色。

快速集成

要在 Spring Boot 项目中启用安全保护,首先需要在 pom.xml 中添加相关依赖:

<dependencies>
    <!-- Web 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Security 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!-- 测试依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

添加依赖后,默认情况下 Spring Security 会拦截所有请求并要求 Basic 认证。我们需要自定义配置类来接管安全逻辑:

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.password.NoOpPasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 配置内存认证
        auth.inMemoryAuthentication()
            .passwordEncoder(NoOpPasswordEncoder.getInstance())
            .withUser("admin").password("admin123").roles("ADMIN")
            .and()
            .withUser("user").password("user123").roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasRole("USER")
            .antMatchers("/").permitAll()
            .and()
            .formLogin().loginPage("/login").permitAll()
            .and()
            .logout().permitAll();
    }
}

配合简单的 Controller 和 Thymeleaf 模板,即可实现基础的页面跳转与权限控制。例如,首页 / 允许匿名访问,而 /admin 路径仅管理员可见。

认证机制

基于内存的认证

上述示例使用的是内存认证,适合开发测试环境。用户信息硬编码在配置中,重启服务即丢失。这种方式简单直接,但无法满足生产环境的数据持久化需求。

基于数据库的认证

生产环境中,通常需要从数据库读取用户信息。这需要引入 JPA 和数据库驱动,并实现 UserDetailsService 接口。

1. 添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

2. 定义实体类

import javax.persistence.*;

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private String role;

    // Getter, Setter, Constructor 省略
}

3. 实现 UserDetailsService

这是连接数据库与 Spring Security 的关键桥梁:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户不存在:" + username);
        }
        List<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority("ROLE_" + user.getRole()));
        return org.springframework.security.core.userdetails.User.builder()
                .username(user.getUsername())
                .password(user.getPassword())
                .authorities(authorities)
                .build();
    }
}

4. 更新 SecurityConfig

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService);
}

此时,系统将从数据库加载用户凭据进行校验。如果需要注册新用户,只需提供一个 POST 接口保存数据到数据库即可。

授权策略

基于角色的授权

最常用的方式是 Role-Based Access Control (RBAC)。通过 hasRole("ADMIN") 或 hasAnyRole("ADMIN", "USER") 限制特定 URL 的访问权限。注意,Spring Security 会自动为角色前缀加上 ROLE_。

基于权限的授权

对于更细粒度的控制,可以使用 hasPermission 或自定义注解。但在大多数业务场景中,基于角色的授权已足够覆盖 90% 的需求。

实际应用场景

在实际开发中,我们通常会遇到以下场景:

  1. 登录与登出:利用 formLogin() 和 logout() 配置自动处理表单提交和会话销毁。
  2. 角色管理:不同角色访问不同菜单或 API。
  3. 安全审计:记录关键操作日志。

测试验证

可以通过单元测试验证权限控制是否生效。例如,使用 TestRestTemplate 模拟无认证请求访问受保护资源,应返回 302 重定向;携带正确凭证的请求则应返回 200。

总结

Spring Boot 与 Spring Security 的结合非常紧密,通过简单的配置即可构建健壮的安全体系。核心在于理解 SecurityConfig 的配置流程,以及 UserDetailsService 在认证中的桥梁作用。无论是内存认证还是数据库认证,最终都服务于统一的用户身份验证模型。在实际项目中,建议根据业务复杂度选择合适的授权方式,并始终记得对密码进行加密存储。

目录

  1. Spring Boot 安全认证与授权
  2. 学习目标
  3. Spring Security 概述
  4. 快速集成
  5. 认证机制
  6. 基于内存的认证
  7. 基于数据库的认证
  8. 授权策略
  9. 基于角色的授权
  10. 基于权限的授权
  11. 实际应用场景
  12. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 网络安全专家邓欣:十五载攻防实战与团队管理心得
  • Z-Image-Turbo 孙珍妮模型使用指南
  • Python 发展前景与零基础入门学习路径
  • AI 狼人杀项目实战:大模型博弈与交互体验设计
  • 具身智能与视觉:机器人如何看懂世界
  • 提升英文写作质量以应对 Turnitin AIGC 检测
  • 解决 Copilot 与 Codex 修改代码时中文乱码的自动化方案
  • 【征文计划】玩转 Rokid JSAR:基于 Web 技术栈的 AR 开发环境搭建、核心 API 应用与 3D 时钟等创意项目全流程解析
  • 大模型 Prompt 调优技巧:提示工程与思维链方法
  • Ubuntu Server 24.04 LVM 分区扩容
  • Java 面试核心知识点总结:Spring、MySQL、并发编程等
  • 从 Oracle 到金仓 KES:PL/SQL 兼容性与 JSON 处理实战
  • 网络安全学习路线:从入门到精通(15 周自学计划)
  • ToDesk ToClaw AI 自动化实测:零代码实现日常办公自动化
  • 2024 前端主流框架演进与性能优化实践总结
  • Claude Code 的三大核心执行模式
  • 智能客服情感化升级实战:降低投诉率的技术方案
  • 鸿蒙 ArkTS 卡片开发实战:音乐播放器组件实现
  • MEMS 3D 视觉技术解决机器人无序抓取钣金件难题
  • 前端大文件分片上传与断点续传实现方案

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online