Spring Integration:SecurityContext 传播

2024-05-16

我对 Spring Integration 中的 SecurityContext 传播有一些困惑。

这是文档的要点:

http://docs.spring.io/spring-integration/reference/htmlsingle/#security-context-propagation http://docs.spring.io/spring-integration/reference/htmlsingle/#security-context-propagation

我的困惑如下:

(1)为了确保我们与应用程序的交互是安全的, 根据其安全系统规则,我们应该提供一些安全保障 具有身份验证(主体)对象的上下文。春天 安全项目提供了一种灵活的、规范的机制 通过 HTTP、WebSocket 或 SOAP 对我们的应用程序客户端进行身份验证 协议(可以对任何其他带有 简单的 Spring Security 扩展),它提供了一个 SecurityContext 对应用程序对象进行进一步的授权检查,例如 消息渠道。默认情况下,SecurityContext 与 当前线程的执行状态使用 (ThreadLocalSecurityContextHolderStrategy)。它是通过 AOP 访问的 安全方法上的拦截器来检查该主体是否 例如,调用有足够的权限来调用该方法。这适用于当前线程, 但经常、处理逻辑可以执行在另一个线程上,甚至在多个线程上,或者在到某些外部系统.

这意味着 SecurityContext(通常)只能由当前线程访问。正确的?

那么,如何使其可供另一个应用程序的另一个线程访问(与 Spring Integration 集成)?

(2)如果我们的应用程序构建在 Spring Integration 组件及其之上,则标准线程绑定行为很容易配置 消息渠道。在这种情况下,受保护的对象可以是任何 服务激活器或变压器,用一个固定MethodSecurityInterceptor在他们的 (参见第 8.8 节,“向端点添加行为”)或者甚至MessageChannel(参见上文 D.2 节“保护通道”)。什么时候 使用 DirectChannel 通信,SecurityContext 可用 自动,因为下游流在当前线程上运行。 但对于 QueueChannel、ExecutorChannel 和 带有Executor的PublishSubscribeChannel,消息传输 根据这些线程的性质从一个线程到另一个(或多个)线程 渠道。为了支持此类场景,我们可以转移 消息头中的 Authentication 对象并提取和 在安全对象访问之前在另一端对其进行身份验证. 或者,我们可以将 SecurityContext 传播到接收该消息的线程 传送的消息.

这意味着我们必须手动提取Principal?如果是,怎么办?

或者从 4.2 版本开始使用传播方面就足够了?

(3)从4.2版本开始安全上下文传播已经 介绍了。它被实现为SecurityContextPropagationChannelInterceptor, 这可以简单地是 添加到任何MessageChannel或配置为@GlobalChannelInterceptor。该拦截器的逻辑基于 从当前线程中提取SecurityContextpreSend()方法,并将其填充到另一个线程postReceive()(beforeHandle()) 方法。其实这个拦截器 是更通用的扩展 ThreadStatePropagationChannelInterceptor,它包装了 消息发送与内部传播状态一起 消息扩展 - MessageWithThreadState, - 在一侧,并且 提取原始消息并将其状态传播到另一个消息上。 ThreadStatePropagationChannelInterceptor 可以扩展为任何 上下文传播用例和 SecurityContextPropagationChannelInterceptor 是一个很好的示例 事情。

“从版本 4.2 开始,引入了 SecurityContext 传播。”=> 好的,很好。

But: “它是作为 SecurityContextPropagationChannelInterceptor 实现的,可以简单地添加到任何 MessageChannel 或配置为 @GlobalChannelInterceptor。”

这是什么意思?我必须实现一个扩展“SecurityContextPropagationChannelInterceptor”的拦截器?

我必须在我的中“添加”什么<int:channel>配置?

如果我使用<int:channel-interceptor>(与@GlobalChannelInterceptor相同),它与使用不同<int:interceptors> ?

其他困惑:

“该拦截器的逻辑基于通过 preSend() 方法从当前线程提取 SecurityContext,并通过 postReceive() 填充到另一个线程 (beforeHandle()) 方法。”

但为什么有一个"obtainPropagatingContext"方法和一个"populatePropagatedContext"方法中的SecurityContextPropagationChannelInterceptor班级? 在哪里进行传播?在 preSent() / post Receive() 方法中,还是在这两个方法中?

此外,我尝试将 SecurityContext 传播到外部应用程序,但没有成功......

关于这一论点的任何解释将不胜感激。


您在这里有很多问题,但让我尝试回答这些问题。

  1. 这是什么意思?我必须实现一个扩展“SecurityContextPropagationChannelInterceptor”的拦截器?

不,框架中有这样一个开箱即用的拦截器。您必须做什么才能了解​​如何添加拦截器MessageChannel: http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#channel-configuration-interceptors http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#channel-configuration-interceptors.

或者像这样:

@Bean
@GlobalChannelInterceptor(patterns = {
        "#{'queueChannel'}",
        "${security.channel:executorChannel}",
        "publishSubscribeChannel" })
public ChannelInterceptor securityContextPropagationInterceptor() {
    return new SecurityContextPropagationChannelInterceptor();
}

请参阅他们的 JavaDocs 以获取更多信息。

  1. 但是为什么SecurityContext Propagation ChannelInterceptor类中有一个“obtainPropagatingContext”方法和一个“populatePropagated Context”方法呢?

SecurityContextPropagationChannelInterceptor extends ThreadStatePropagationChannelInterceptor<Authentication>, 在哪里obtainPropagatingContext and populatePropagatedContext只是提取一些当前的通用方法State in the preSend()(在线程上)并提供State用于人口/操纵postReceive(),这可能发生在不同的线程中。

  1. Yes, SecurityContext在 Spring Security 中是线程绑定的,并且确保我们可以执行安全功能的逻辑完全基于ThreadLocal多变的。这就是为什么我们必须以这种方式转移它。 “传播”是一个过程而不是状态。

不确定您所说的“外部应用程序”是什么意思,但只有一种机制可以做到这一点:将凭据与请求一起发送到该应用程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Integration:SecurityContext 传播 的相关文章

随机推荐

  • 如何使用 Telegram Bot API 获取 Telegram 频道用户列表

    任何人都可以告诉我如何从我的电报机器人获取有关用户的信息 想象一下我的机器人是我频道中的管理员用户 我想获取我的频道用户列表或在新用户加入时引起注意 我怎样才能做到这一点 Telegram 的文档非常杂乱 到目前为止我已经看过这些 http
  • Swift:检查 UISearchBar.text 是否包含 url

    如何检查 UISearchBar text 是否包含 URL 我想做这样的事情 if searchBar text NSTextCheckingType Link 但我收到错误 String is not convertible to NS
  • 在 Azure 上运行 .NET 应用程序

    我拥有在 Amazon EC2 上运行应用程序的丰富经验 它需要一台低端服务器 我目前为该服务器支付大约 90 美元 月 是的 我知道我并不真正需要可扩展性 但我仍然使用 EC2 我想知道将这个纯粹的 NET 应用程序迁移到 Microso
  • XSLT - 追加同级

    我正在尝试使用 XSLT 来附加context param作为最后一个兄弟姐妹 没有共同的父元素 因此任务有点困难 我想附加以下元素
  • 如何搜索表中的所有列?

    如何在 SQL Server 中搜索表的所有列 SELECT FROM yourtable WHERE val IN field1 field2 field3 field4 如果您正在寻找精确的全场比赛 如果你正在寻找子字符串匹配 你将不得
  • 从 Java 中提取 Lotus Notes Document 的完整 ACL

    我正在尝试找到一种方法来保存特定 Lotus Notes 文档的完整用户列表访问权限 我知道我可以从catalog nsf 获取数据库级ACL 但不能获取文档级访问权限 此外 我相信文档的 作者 字段不会列出只读访问用户 有谁知道如何获取特
  • 有谁知道类似于 SVN Time-Lapse View 的 Git 工具 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 SVN Time Lapse View 是一个跨平台查看器 可以下载文件的所有修订版本 并允许您通过拖
  • 与新 Apple Music 应用程序中相同的动态状态栏

    是否可以动态着色statusBar这是在新的苹果音乐应用程序 Edit iOS 8 4 中的新 Apple Music 应用程序具有此功能 打开应用程序 选择并播放歌曲 状态栏为白色 向下滑动播放器控制器以查看 我的音乐 控制器 它有黑色状
  • 为什么我无法创建/签出该分支?

    我正在尝试创建本地 Git 分支 但它不起作用 以下是我正在使用的命令 tablet edit11 git checkout b edit 11 Switched to a new branch edit 11 tablet edit11
  • 删除实例后,Azure 云服务变得无响应?

    我的 Azure 云服务 当它从 3 个实例缩减到 2 个实例时 我的网站会变得无响应几分钟 我的印象是 我的现有实例将保持不变 除了那些被删除的实例 并且我的网站将继续正常运行 我可能是错的 这是正常行为吗 当您从 2 个实例缩减到 1
  • Node.JS async.parallel 不会等到所有任务完成

    我在用异步并行 https github com caolan async并行运行两个函数 这些函数请求 RSS 源 然后 RSS 提要被解析并添加到我的网页中 但由于某种原因async parallel运行回调方法而不等待两个函数完成 文
  • Angular 4 显示其中的数据

    我不喜欢从 API 返回到我的 Angular 4 应用程序的数据 这是 JSON 的示例 我不关心美元 但这是我正在处理的数据类型 最终目标是在页面上展示 Coin Price BTC 4 281 28 ETH 294 62 etc JS
  • 如何从引擎覆盖 Rails 应用程序路由?

    我有一个 Rails 应用程序 我正在尝试将 Rails 引擎集成到其中 主机应用程序有一些捕获所有路由 magic urls match gt admin rendering show match path edit gt admin r
  • Vue 2 日期选择器组件

    我正在尝试使用 Bootstrap Datepicker 创建 Vue 2 组件 但在选择日期后尝试更新输入时遇到困难 这是我的代码 Vue component datepicker template
  • VS Code 即使关闭也使用 100% CPU

    即使未打开 VS Code 也会占用 100 的 CPU 使用率 我跑了ps aux grep PID命令查看详细信息但什么也看不懂 这是输出 tawhid 27099 100 0 0 1 447352160 11856 R 7 18PM
  • 获取mongodb中单个查询的最小值和最大值

    考虑 Words 中的以下文档 id 1 usages 2 word Name id 2 usages 1 word Street id 3 usages 1 word House id 4 usages 3 word Table id 5
  • Android Ble GATT_ERROR 133 经常使用三星设备

    我正在研究 BLE 应用程序 我已经使用 Nexus Moto Samsung LG 等不同设备进行了测试 我仅在三星设备中收到 GATT 错误 133 三星 A5 2016 尝试连接 10 次 但只连接了 2 或 3 次 请帮助我 Non
  • 将 Boost 库添加到 Windows Eclipse 中的 C++ 项目

    我最近使用安装程序在 Windows 上安装了 Boost 库 我试图链接到 Eclipse 中的库 但运气不佳 我尝试浏览 Project Properties gt C C Build gt Settings gt MinGW C Li
  • 如何在R中匹配具有相同主键的两个表中的数据

    我有两个表 其中包含有关人员的数据 df1 lt data frame id c 113 202 377 288 359 name c Alex Silvia Peter Jack Jonny 这为我提供了 id name 1 113 Al
  • Spring Integration:SecurityContext 传播

    我对 Spring Integration 中的 SecurityContext 传播有一些困惑 这是文档的要点 http docs spring io spring integration reference htmlsingle sec