处理JMS侦听器的Spring Security的首选方法是什么?

时间:2018-07-24 21:18:12

标签: java spring-security apache-camel jms activemq

我有一个有点单片的Java应用程序,它围绕Spring @Service bean构建用于我的业务服务层。通常,我的每个业务服务方法都具有Spring Security批注(例如@PreAuthorize),以对该操作实施适当的授权规则。

在主要的Web应用程序流程中,此方法非常有效;每个Web请求都暗含通过会话Cookie等处理的身份验证。

但是,当涉及到与其他“内部”系统的各种集成点时,我认为解决方案并不明确。

例如,我将使用JMS队列中的方法,该队列已在代理中定义了自己的身份验证和授权规则,因此我想隐式“信任”我收到的消息。但是,按照目前的情况,足够简单的骆驼路线是这样的:

WidgetService widgetService = lookup(WidgetService.class);
from("activemq:newWidget")
    .unmarshall(...)
    .bean(widgetService, "newWidget");

最终抛出AuthenticationCredentialsNotFoundException

这告诉我骆驼正确地调用了我的bean,而所有魔术AOP都来自Spring。

对于这类事情,我采取了在系统的入口点附近应用AOP建议的方法(例如,在Quartz Job的{​​{1}}方法周围),该方法注入了{{ 1}},但我不确定这是否是最好的方法。

我应该继续将这些“可信”入口点包装在建议中以添加身份验证上下文,还是应该更改服务层以使其具有某些不需要身份验证的特殊业务方法形式,并确保我清楚地记录了以下内容:它们不用于网络execute方法等吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,有最好的方法来做到这一点。这取决于应用程序,以我的经验,所有解决方案都可以工作,但是有一些缺点。

第一个解决方案是将@PreAuthorize移至Web级别。这样,您将可以随意在内部自由使用您的服务。我认为这是更简单且更容易理解的解决方案。您想保护您的网络用户权利吗?为什么不将安全性应用于Web层。问题在于,Web层比业务层更频繁地进行更改,并且如果不认真开发控制器和端点,则更容易留下安全漏洞。对于大多数应用程序,我仍然会采用这种方法,并让服务层只处理业务规则而不是安全性(这也是业务规则吗?)。当然,您仍然可以向控制器和东西组添加一些默认的安全逻辑,因此您不必到处重复。

第二种方法是您采用的方法。在您生成的经过身份验证的上下文中运行此类方法。这有点反逻辑-当没有经过身份验证的用户时,为什么要在经过身份验证的上下文中运行?您不必这样做,但是不幸的是,这是您想要获得安全服务的唯一方法。此方法不太容易出现安全错误,并且您可以更轻松地维护安全性。如果您坚持这样做,则可以使用模板模式或创建一些在上下文中运行内容的执行程序类。

我想不出第三种方法:)