OSGi 用户管理服务用户对象



我想使用OSGi用户管理服务来确保安全性,但我无法获得足够的资源。我想对将安装在系统中的某些捆绑包进行身份验证,并在身份验证后由用户对象表示它们。以便我以后可以使用这些用户对象进行授权。

我有两个问题:

  1. 由于我有多个用户,我如何知道哪个捆绑包正在调用安全方法?(我不想将用户对象作为参数传递给我要控制的每个方法)。

  2. 如何将捆绑包与表示它们的用户对象相关联?

我希望有一个捆绑包作为入口点,它将对所有其他捆绑包进行身份验证并控制它们。但我什至找不到任何人提到使用用户管理服务。除了CPA之外,OSGi安全还有其他选择吗?我也想使用它来保护我的控制台。

这是相当多的问题合二为一。让我试着回答所有这些问题。

首先,UserAdmin 服务在 OSGi 纲要中指定。在那里,它解释了如何定义用户、角色等,以及如何使用服务来回答诸如"此用户是否有角色 X"之类的问题?这并没有告诉您如何将此服务用作安全解决方案的一部分。这取决于你。

关于问题 1,它不是与 OSGi 相关的问题(而是 Java 应用程序中的通用问题),传统上有一些将"上下文"传递给方法的方法:

  1. 使其成为每个方法的参数(您不想这样做)。
  2. 将其存储在 ThreadLocal 上下文中(这在 JavaEE 中相当流行,但如果应用程序将工作委托给可能正确传递或可能不会正确传递此类上下文的线程池,则有其缺点)。
  3. 如果这完全是关于你自己实现的服务(而不是第三方服务)的安全性,你可以使用 OSGi 中的 ServiceFactory 模式为每个客户端捆绑包提供它自己的上下文(并将 User 对象嵌入其中;例如,看看 Felix 中的 LogService 实现,它使用该机制为每个日志消息添加 bundle.id)。
  4. 有时,将上下文嵌入到方法中,
  5. 而不是嵌入到方法的额外参数中,而是作为某些现有对象的一部分也是有意义的(因此,您可以有效地将上下文与特定对象相关联,这可能有意义,也可能没有意义,具体取决于您的域)。
  6. 另一种选择是使用 Apache Felix 依赖管理器来拦截您想要保护的服务(一方面),并在这方面找出捆绑包在调用什么,并进行适当的安全检查(如果您想试一试,可能需要更详细的答案)。

关于问题 2,捆绑包有一个符号名称来标识它们。您可以使用它将捆绑包与用户关联。还有其他选择,但这是最明显的选择。

关于

您关于OSGi安全性选项的问题,我想说ConditionalPermissionAdmin(以及较旧的PermissionAdmin)是解决OSGi框架本身安全性的唯一解决方案,如果您想指定特定捆绑包在导入软件包,使用服务,访问文件系统等方面可以做什么和不能做什么。如果要将其与 UserAdmin 集成,则必须编写自己的自定义权限。

最后,安全控制台是您需要解决的另一件事。你也许能够找到一些构建块,因为我知道有人已经实现了一些基于角色的访问(我想到了David Bosschaert)。但是,控制台是一个复杂而强大的东西,因此单独回答这个问题需要的不仅仅是一个简单的 SO 问题,因为它取决于您要实现的内容和细粒度。

最新更新