OSGi 用户管理服务用户对象
Posted
技术标签:
【中文标题】OSGi 用户管理服务用户对象【英文标题】:OSGi User Admin Service User Objects 【发布时间】:2015-01-13 20:26:38 【问题描述】:我想使用 OSGi 用户管理服务来确保安全,但我无法获得足够的资源。 我想对将安装在系统中的某些捆绑包进行身份验证,并在身份验证后由用户对象表示它们。这样我以后可以使用这些 User-Object 进行授权。
我有两个问题:
由于我有多个用户,我如何知道哪个包正在调用安全方法? (我不想将用户对象作为参数传递给我想要控制的每个方法)。
如何将捆绑包与代表它们的用户对象相关联?
我希望有一个包作为入口点,它将验证所有这些其他包并控制它们。但我什至找不到任何人提到使用用户管理服务。除了 CPA,OSGi 安全性还有其他选择吗?我也想用它来保护我的控制台。
【问题讨论】:
【参考方案1】:这是很多问题合二为一。让我试着一一回答。
首先,在 OSGi 纲要中指定了 UserAdmin 服务。在那里,它解释了如何定义用户、角色等,以及如何使用该服务来回答诸如“此用户是否具有角色 X”之类的问题?这并没有告诉您如何将此服务用作安全解决方案的一部分。这取决于你。
关于问题 1,它不是 OSGi 相关问题(而是 Java 应用程序中的通用问题),传统上存在一些将“上下文”传递给方法的方法:
-
将其作为每个方法的参数(您不想这样做)。
将其存储在 ThreadLocal 上下文中(这在 JavaEE 中相当流行,但如果您的应用程序将工作委托给可能会或可能不会正确传递此类上下文的线程池,则会有其缺点)。
如果这完全是关于您自己实现的服务(而不是第三方的)的安全性,您可以使用 OSGi 中的 ServiceFactory 模式为每个客户端捆绑包提供自己的上下文(并在其中嵌入 User 对象;例如查看 Felix 中的 LogService 实现,它使用该机制将 bundle.id 添加到每条日志消息)。
有时,不将上下文嵌入到方法的额外参数中,而是将其作为某些现有对象的一部分嵌入也很有意义(因此,您可以有效地将上下文与特定对象相关联,这可能有意义,也可能没有意义,具体取决于您的域名)。
另一种选择是使用 Apache Felix 依赖管理器来拦截您想要保护的服务(通过方面),并在方面确定正在调用的包,并进行适当的安全检查(可能需要如果您想试一试,请提供更详细的答案。
关于问题 2,捆绑包具有标识它们的符号名称。您可以使用它将捆绑包与用户相关联。还有其他选择,但这是最明显的选择。
关于您关于 OSGi 安全性选项的问题,我想说 ConditionalPermissionAdmin(和较旧的 PermissionAdmin)是解决 OSGi 框架本身安全性的唯一解决方案,如果您想指定特定捆绑包可以和不可以做什么导入包、使用服务、访问文件系统等。如果您想将其与 UserAdmin 集成,则必须编写自己的自定义权限。
最后,安全控制台是您需要解决的另一件事。你可能会找到一些构建块,因为我知道有人实现了一些基于角色的访问(我想到了 David Bosschaert)。但是,控制台是一个复杂而强大的东西,因此仅回答这个问题就不仅仅是一个简单的 SO 问题,因为它取决于您想要实现它的内容和粒度。
【讨论】:
首先非常感谢您的详细解答。我使用声明式服务来处理不同的服务注册问题,所以我认为选项 3 和 5 对我不起作用。我已经为安全实施了条件权限管理。我想使用用户管理员对稍后由第三方添加的服务进行基于角色的控制。选项 1 和您对问题 2 的回答是我现在看到的可行选项。但由于用户管理员没有完全控制整个过程,我正在考虑完全摆脱它。 在一本德文书籍“Die OSGi 服务平台”link 中,他们介绍了用户管理服务并提供了一个保护控制台的示例,但它是一个非常简化的版本,假设只有一个用户存在& 根本没有提到多个用户的上述问题。您是否知道任何其他使用用户管理员进行基于角色的安全性的完整参考?如果整个过程有一个标准化的方法,那就太好了。以上是关于OSGi 用户管理服务用户对象的主要内容,如果未能解决你的问题,请参考以下文章
YouTube API - Oauth2 流程(OSGI 捆绑包)