【问题标题】:How to call security setup when message received using Spring Integration使用 Spring Integration 收到消息时如何调用安全设置
【发布时间】:2016-07-18 20:06:33
【问题描述】:

我目前正在使用 Spring Integration 从队列中获取消息并使用服务激活器将它们发送到服务。我的问题是我正在调用的服务需要为当前线程准备好安全上下文。这可以通过调用另一个 bean 的无参数方法 handleAuthentication() 来设置。我想知道在调用服务激活器服务之前,每当收到新消息时调用它的最佳方法是什么?我原本想将两个服务激活器链接在一起,第一个调用 handleAuthentication(),但这似乎不正确,因为 handleAuthentication() 不需要来自实际消息的任何信息。

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    是的,您对安全处理的假设是正确的。这实际上只是一个副作用方面,不应与业务逻辑绑定。

    因此,我们应该使用允许我们在程序中遵循相同行为的东西。它在编程中也被称为Aspect

    为此,Spring Integration 建议使用像 MessageChannelInterceptor 这样的钩子,根据您的解释,您可以在 preReceive() 回调中完全实现您的 handleAuthentication()

    另一个技巧可以通过<request-handler-advice-chain>MethodInterceptor 实现实现,它应该在目标服务调用之前将SecurityContext 填充到当前线程中。

    【讨论】:

    • 我遇到了 preReceive 和 postReceive 如何工作的问题。每次轮询通道时都会调用这些方法,无论是否有消息。有没有一种方法,只有在确实有消息的情况下才会调用这些方法?否则,它将不断调用 handleAuthentication()。
    • 哦,对了!在postReceive() 回调中做同样的事情怎么样?
    • postReceive() 实际上总是在轮询时被调用。我通过查看org.springframework.integration.channel.AbstractPollableChannelreceive(long timeout) 方法验证了这一点。当没有消息时,回调只会收到消息的 null 返回。
    • 是的,但是您可以检查您的实现if (message != null),并且只有在这种情况下执行您的handleAuthentication()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2019-06-08
    • 2015-06-17
    • 1970-01-01
    相关资源
    最近更新 更多