跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Boot 安全认证与授权实战

Spring Boot 集成 Spring Security 实现应用层安全。本文涵盖基础配置、内存与数据库认证方式、基于角色的权限控制及常见应用场景。通过示例代码演示如何快速搭建登录鉴权体系,解决用户身份验证与资源访问控制问题,确保系统安全性。

疯疯癫癫发布于 2026/3/21更新于 2026/9/1161 浏览
Spring Boot 安全认证与授权实战

Spring Boot 安全认证与授权实战

在构建企业级应用时,安全是绕不开的话题。Spring Boot 默认集成了 Spring Security,提供了强大的认证与授权能力。本文将带你从零开始,掌握如何在项目中落地安全机制。

快速集成

引入 spring-boot-starter-security 依赖后,Spring Security 会自动拦截所有请求并启用默认的安全策略(如 Basic 认证)。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <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>

自定义安全配置

默认配置通常无法满足业务需求,我们需要创建一个配置类来接管安全逻辑。注意,在较新版本中 已被标记为过时,但为了保持示例兼容性,这里仍沿用该模式。

WebSecurityConfigurerAdapter
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 {
        // 内存认证:仅用于演示,生产环境请使用数据库或 LDAP
        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();
    }
}

基于数据库的认证

实际开发中,用户信息通常存储在数据库中。核心在于实现 UserDetailsService 接口。

import org.springframework.beans.factory.annotation.Autowired;
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;

@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);
        }
        // 将角色转换为 GrantedAuthority
        return org.springframework.security.core.userdetails.User.builder()
                .username(user.getUsername())
                .password(user.getPassword())
                .authorities(new SimpleGrantedAuthority("ROLE_" + user.getRole()))
                .build();
    }
}

在配置类中注入这个 Service:

@Autowired
private UserDetailsServiceImpl userDetailsService;

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

权限控制

Spring Security 支持基于角色(Role)和权限(Permission)的控制。最常用的方法是 hasRole(),它会自动添加 "ROLE_" 前缀。

对于更细粒度的控制,可以使用 hasAuthority()。例如,限制只有管理员才能访问 /admin 路径,普通用户只能访问 /user。

最佳实践提示

  1. 密码加密:示例中使用 NoOpPasswordEncoder 是为了方便理解,生产环境务必使用 BCrypt 等强哈希算法。
  2. CSRF 保护:表单登录默认开启 CSRF,跨域场景需额外配置。
  3. HTTPS:敏感数据传输必须强制使用 HTTPS。

通过上述步骤,你可以快速为 Spring Boot 应用建立起基础的认证与授权防线。根据业务复杂度,后续还可以扩展 OAuth2、JWT 等方案。

目录

  1. Spring Boot 安全认证与授权实战
  2. 快速集成
  3. 自定义安全配置
  4. 基于数据库的认证
  5. 权限控制
  6. 最佳实践提示

更多推荐文章

查看全部
  • 使用文心一言设计智能体工作流提示词
  • jQuery DOM 操作详解:节点创建、插入与删除实战
  • 2024 年 AI 行业六大高薪职位解析与薪资参考
  • 汉诺塔问题的递归与非递归 C++ 解法
  • 多线程程序崩溃原因:C++ 同步机制常见陷阱与解决方案
  • PostgreSQL 模式(Schema)详解:数据库对象命名空间管理
  • VS Code 远程连接服务器后 GitHub Copilot 无法使用问题的排查与修复
  • 智能家居界面美化指南:Home Assistant 主题配置与布局优化
  • [AI提效-18]-豆包AI绘图提示词全攻略(新手可直接套用)
  • 单细胞虚拟基因敲除分析及高级可视化:从预处理到 UMAP
  • Python 入门实战:猜数字游戏完整教程
  • 10 个 Python 入门小游戏源码与教程,零基础掌握编程基础
  • MedReason:利用知识图谱构建大规模医学推理数据集与专家模型
  • JetBrains Copilot Agent Mode + MCP 配置实战
  • 文心一言使用指南:从入门到精通
  • Ollama 本地代码补全助手配置指南
  • 在 JetBrains IDE(Idea/WebStorm)中配置使用 Claude Code
  • 基于Python的量化交易实盘部署与风险管理指南
  • 星辰 RPA 制作小红书自动发文机器人
  • Linux 搭建 Web 服务器指南:Nginx 与 Apache 安装配置

相关免费在线工具

  • 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