SpringSecurity是什么?

Spring Security是Spring生态中的安全框架,用于管理Web应用的认证与权限控制,支持多种登录方式并集成防护机制,可防范CSRF/XSS等攻击,保障企业级系统的安全性。

一、核心功能与定位

  1. 身份认证(Authentication) 验证用户身份,支持多种认证方式:

    • 表单登录:传统用户名/密码登录。

    • OAuth2/JWT:适用于前后端分离或第三方登录场景。

    • LDAP/HTTP Basic:集成企业目录服务或简单 API 认证。

  2. 授权(Authorization) 控制用户访问资源的权限:

    • 基于角色(Role):如ADMIN、USER等粗粒度控制。

    • 基于权限(Authority):细粒度控制(如read、write)。

    • 方法级安全:通过@PreAuthorize注解动态校验权限。

  3. 攻击防护 内置防御常见 Web 攻击:

    • CSRF(跨站请求伪造):自动生成并验证 Token

    • 会话固定攻击:用户登录后重置 Session ID。

    • 安全响应头:自动添加X-Content-Type-Options等防护头。

二、架构与核心设计

  1. 过滤器链(Filter Chain)

    • 通过DelegatingFilterProxy拦截 HTTP 请求,由一系列安全过滤器(如UsernamePasswordAuthenticationFilter)处理认证、授权等逻辑。

    • 典型流程:请求 → 认证过滤器 → 授权校验 → 资源访问。

  2. 核心组件

    • SecurityContextHolder:存储当前用户的安全上下文(如认证信息)。

    • UserDetailsService:加载用户数据(如从数据库或内存),返回UserDetails象。

    • AuthenticationManager:协调认证流程,委托给DaoAuthenticationProvider等实现。

三、关键优势

  1. 深度集成 Spring 生态

    • 无缝兼容 Spring Boot、Spring MVC,支持自动配置(如默认启用基础安全规则)。

    • 通过@EnableWebSecurity快速启用安全模块。

  2. 模块化与可扩展性

    • 支持按需扩展认证方式(如自定义UserDetailsService)。

    • 提供 Servlet 应用(spring-security-web)和 Reactive 应用(spring-security-reactive)独立模块。

  3. 企业级安全实践

    • 遵循 纵深防御(Defense in Depth)原则,从网络层到数据层多层防护。

    • 支持 密码加密(BCrypt/SCrypt)、HTTPS 强制、会话并发控制等。

四、典型应用场景

场景技术方案示例
传统 Web 应用表单登录 + 会话管理后台管理系统,基于角色控制菜单权限。
前后端分离架构JWT/OAuth2 + 无状态配置RESTful API 使用 JWT 令牌认证,禁用 Session。
微服务安全Spring Cloud Security + OAuth2 授权服务器微服务间通过令牌中继(Token Relay)传递身份。

五、与 Shiro 的对比

特性Spring SecurityApache Shiro
集成 Spring✅ 深度无缝集成⚠️ 需手动适配
功能范围认证、授权、攻击防护、会话管理全覆盖侧重认证和授权,防护能力较弱
学习曲线较陡峭(配置复杂)更简单易用
适用规模中大型企业级项目中小型项目

六、典型案例展示

1.基础Web应用安全(单体架构)
  1. 表单登录+URL权限控制

    • 场景:传统后台管理系统(如OA系统)

    • 核心配置

      @Configuration
      @EnableWebSecurity
      public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll()  // 公开路径.antMatchers("/admin/**").hasRole("ADMIN")  // 管理员权限.anyRequest().authenticated()  // 其他路径需登录.and().formLogin()  // 启用表单登录.loginPage("/login")  // 自定义登录页.permitAll();}
      }
    • 特点:

      • 默认生成登录页,支持自定义UI(Thymeleaf模板)

      • 内存用户认证(auth.inMemoryAuthentication())或数据库用户认证扩展

  2. 前后端分离架构(RESTful API安全)

    1. JWT无状态认证

      • 场景:移动端/前端调用API接口

      • 实现流程:

关键代码:

// JWT过滤器
public class JwtFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {String token = request.getHeader("Authorization");if (token != null) {Authentication auth = jwtUtil.parseToken(token);  // 解析TokenSecurityContextHolder.getContext().setAuthentication(auth);  // 注入安全上下文}chain.doFilter(request, response);}
}
  • 配置要点:

    • 禁用Session(http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)

    • 开放登录接口(.antMatchers("/auth/login").permitAll())

  1. 方法级注解控制

    • 使用@PreAuthorize实现细粒度授权:

      @RestController
      public class UserController {@GetMapping("/api/user/{id}")@PreAuthorize("hasAuthority('READ_USER')")  // 需READ_USER权限public User getUser(@PathVariable Long id) { ... }
      }
  2. 微服务安全(OAuth2 + JWT)
    1. OAuth2授权服务器

      • 场景:多服务统一认证(如电商系统)

      • 架构:

资源服务器配置

@EnableResourceServer
@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/**").authenticated();  // 保护API路径}
}
3.自定义认证与数据库集成
  1. JDBC用户认证服务

    • 场景:从数据库动态加载用户权限

    • 实现步骤:

      1. 创建用户表(含username, password, roles字段)

      2. 实现UserDetailsService接口:

        @Service
        public class JdbcUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) {User user = userRepository.findByUsername(username);List<GrantedAuthority> authorities = user.getRoles().stream().map(role -> new SimpleGrantedAuthority("ROLE_" + role)).collect(Collectors.toList());return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);}
        }
      3. 配置密码编码器(推荐BCrypt):

        @Bean
        public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
        }

六、总结

Spring Security 是 Spring 应用安全的基石,通过 模块化设计深度可定制性 满足从单体应用到微服务的复杂需求。其核心价值在于:

  1. 标准化安全流程:提供认证、授权、防护的一站式解决方案;

  2. 企业级可靠性:内置最佳实践(如 CSRF 防护、密码加密);

  3. 生态整合优势:与 Spring Boot、Spring Cloud 协同简化配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912323.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nt!IoSynchronousPageWrite函数分析之atapi!IdeReadWrite----非常重要

第一部分&#xff1a;预分析 1: kd> g Breakpoint 7 hit atapi!IdeReadWrite: f729cb2a 55 push ebp 1: kd> kc # 00 atapi!IdeReadWrite 01 atapi!IdeSendCommand 02 atapi!AtapiStartIo 03 atapi!IdeStartIoSynchronized 04 nt!KeSynchronizeExecuti…

软考系统架构设计师经验总结

本文目的 对参加的2025年上半年系统架构设计师考试进行总结提供一些备考思路给未来参加系统架构设计师的同学 个人背景 工作背景 本科计算机与技术&#xff08;学过一些计算机基础课程&#xff09;&#xff0c;15年毕业后从事过b端&#xff08;人群画像、营销、用户增长、硬…

Tailwind CSS工作原理

文章目录 前言1. 指令解析与 AST 操作&#x1f6a9; **核心处理流程**&#x1f9e9; **具体流程说明** 2. **配置驱动的样式生成**3. **JIT 模式&#xff08;Just-In-Time&#xff09;的核心逻辑**4. **插件与自定义扩展**5. **与 PostCSS 管道的协同**6. **优化与 Tree Shakin…

web网页开发,在线%旅游景点管理%系统demo,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql

经验心得 两业务单&#xff0c;都是业务逻辑开发&#xff0c;基本crud&#xff0c;什么是前后端&#xff0c;怎么分离前后端&#xff0c;前后端怎么通讯的&#xff0c;是以什么格式进行通讯这些咱们都需要掌握&#xff0c;后面剩下就是前后端不同层如何优化。管理系统很常见了其…

面试150 长度最小的子数组

思路 联想到滑动窗口法。左窗口的值为0&#xff0c;遍历数组对数组求和&#xff0c;当数组的和大于等于target的时候&#xff0c;窗口要收缩&#xff0c;计算子数组的长度&#xff0c;并及时更新最小的长度&#xff0c;左窗口右移。 class Solution:def minSubArrayLen(self,…

Python字典的查询操作

一、前言 在 Python 中&#xff0c;字典&#xff08;dict&#xff09; 是一种非常常用的数据结构&#xff0c;以键值对&#xff08;Key-Value Pair&#xff09;形式存储数据&#xff0c;支持快速查找、插入和删除操作。 本文将系统性地介绍 Python 字典中常见的查询操作方法&…

pyhton基础【18】面向对象基础一

目录 一.面向对象 二.面向对象概述 三.类与对象 一.面向对象 Python中的面向对象编程OOP是一种编程范式&#xff0c;它使用对象来设计软件。对象是具有属性(称为属性)和可以执行的操作(称为方法)的数据结构。 基础概念 类&#xff1a;class 类是创建对象的蓝图或模板。它…

Requests源码分析:面试考察角度自验(初级)

简单描述执行流程 Q:能简单描述一下发送一个requests.get(url)请求时,在requests库内部的主要执行流程吗?(从调用get方法到收到响应) 入口委托: get() 方法内部调用 requests.request(GET, url)。Session 接管: request() 方法会获取或隐式创建一个 Session 对象,并调用…

鸿蒙5:条件-循环-列表渲染

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

浅谈AI大模型-MCP

MCP简介 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议 &#xff09;&#xff0c;24年11月初的时候Anthropic发了一篇技术博客&#xff0c;推出了他们的模型上下文协议MCP&#xff0c;介绍了一种规范&#xff1a;应用如何为LLM提供上下文。官网称MCP为AI应…

MySQL数据库基础概述

前言&#xff1a; MySQL作为全球应用最广泛的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;​&#xff0c;凭借其高性能、高可靠性与零成本特性&#xff0c;已成为Web应用、企业系统的核心数据引擎。它遵循SQL标准&#xff0c;通过表结构实现数据的结构化存储&#x…

桌面小屏幕实战课程:DesktopScreen 16 HTTP

飞书文档http://https://x509p6c8to.feishu.cn/docx/doxcnrxBs55qGn6xoysTcJpqwRf /home/kemp/work/esp/esp-idf/examples/protocols/http_request 源码下载方式参考&#xff1a; 源码下载方式 心知天气 注册账号&#xff0c;申请产品&#xff0c;获取密钥 产品 天气数据 H…

vs2019 + QT下 vs2019创建的项目打开ui文件失败

问题: 在vs2019 QT模式下。使用2019创建工程后。点击ui文件打开时。出现奔溃&#xff0c;如下图 解决方式&#xff1a; ui文件->右键->打开方式->添加->程序->点击三个点->qcreator(qt安装目录) ->设置为默认值->确定 点击设置为默认值&#xff0c;点…

WPS之PPT镂空效果实现

1、准备一张图片&#xff0c;剪切存入剪贴板 2、把图片设为背景 右键 》 设置背景格式 》 图片或纹理填充 》 图片填充选择剪贴板 3、插入一个矩形覆盖全图&#xff0c;设置无线条渐变填充从左到右 4、插入圆角矩形 5、单击小黄点调整弧度 6、选择无线条幻灯片背景填充 7、插…

服务注册中心的本质抉择:从业务本质看AP与CP的终极之选

本文从服务注册中心的本质职责出发&#xff0c;通过分析其核心功能、业务场景和技术约束&#xff0c;深入探讨服务注册中心在架构设计上应该优先保证AP还是CP特性。文章首先剖析服务注册中心的根本使命&#xff0c;然后从分布式系统原理、生产实践案例和性能表现三个维度进行对…

mybatis-plus从入门到入土(一):快速开始

​ 朋友们, 大家好, 从今天开始我想开一个系列博客。名字起的比较随意就叫Mybatis-Plus从入门到入土, 这系列博客的定位是从基础使用开始, 然后逐步深入全面的了解Mybatis-Plus框架, 写这个博客的主要原因是工作中经常用到Mybatis-Plus框架, 因而对这个框架相对比较了解一些, 顺…

如何快速将iPhone中的文本保存到电脑上

您的 iPhone 上是否有很多重要的短信&#xff0c;并且您想将短信备份到计算机上&#xff1f;我们都知道传输消息与传输照片不同&#xff0c;但幸运的是&#xff0c;您可以使用相关的工具和方法来实现。我们介绍了 4 种方法来解释如何将 iPhone 中的文本保存到计算机。所有的办法…

【OpenGL学习】(八)图形变换

OpenGL图形变换介绍&#xff1a;https://learnopengl-cn.github.io/01%20Getting%20started/07%20Transformations 【OpenGL学习】&#xff08;八&#xff09;图形变换 本项目将通过变换矩阵&#xff0c;对【OpenGL学习】&#xff08;七&#xff09;纹理单元 中的图形进行缩放…

从理论到实战:解密大型语言模型的核心技术与应用指南

一、Transformer&#xff1a;语言理解与生成的基石 Transformer 架构的出现&#xff0c;彻底改变了自然语言处理&#xff08;NLP&#xff09;的格局。它以“注意力”为核心&#xff0c;将全局依赖的捕捉效率推向新高。下面用 图简要概览其数据流&#xff1a; 从上图可见&#…

kali换源

在Kali Linux中切换软件源可以提高软件下载速度&#xff0c;下面为你介绍切换源的方法。 一、备份原配置文件 首先备份原配置文件&#xff0c;避免操作失误导致问题&#xff1a; sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak二、编辑源配置文件 使用以下命令编…