【问题标题】:How to ask external backend for permissions?如何向外部后端请求权限?
【发布时间】:2015-06-12 05:11:54
【问题描述】:

我们的应用程序需要检查多个后端的身份验证和授权。

为此,我们为每个后端编写了一个 LoginModule,现在最终得到一个具有多个 Principal 的主题。到目前为止,一切都很好!

应用程序需要在运行时检查自定义权限。委托人是否具有该自定义权限取决于从特定后端获取的信息。从现在开始,我们就被困在这里!

我们实现了自己的权限并使用 AccessController.checkPermission 来检查这些权限。但是如何告诉 JAAS 实际授予的权限呢?没有什么像例如Principal.setPermissions() 我们可以在 LoginModule 中调用。

Acl 和 Group 接口最初看起来很有希望,但被标记为已弃用,因此必须有不同的方法。但是哪个?

有很多关于如何编写策略文件的教程,但这并不是我们所需要的。相反,我们需要向后端询问主体的权限。再一次,我们需要同时使用多个后端,每个后端只知道“它自己的”本机权限,但不知道是否允许特定代码打开套接字或文件 - 所以基于原始文件的策略必须仍然到位。

有没有 JAAS 专家可以告诉我们需要实现什么以及如何在运行时让 JAAS 知道它?

【问题讨论】:

    标签: java permissions authorization jaas


    【解决方案1】:

    我不是真正的 JAAS 专家,我还没有尝试过您的要求。 也许我的第一个想法对你有帮助。

    1. 使用实际的Subject 创建一个javax.security.auth.SubjectDomainCombiner
    2. 用与Principal 关联的所有Permissions 填充新的java.security.Permissions
    3. 将权限和主体与java.security.ProtectionDomain#ProtectionDomain(CodeSource, PermissionCollection, ClassLoader, Principal[]) 结合起来,具体取决于您的上下文CodeSource 可以是null,而PermissionCollection 是在步骤2 中创建的Permissions 实例。Principal 数组都是Principals与Permissions 关联。
    4. 通过javax.security.auth.SubjectDomainCombiner#combine(ProtectionDomain[], ProtectionDomain[])结合当前(来自实际AccessControlContext)和新ProtectionDomains。
    5. 基于当前的AccessControlContextSubjectDomainCombiner 创建一个新的java.security.AccessControlContext#AccessControlContext(AccessControlContext, DomainCombiner)

    在您的以下代码中改用 AccessControlContext(第 4 步)。

    希望能有所帮助和有效。

    【讨论】:

    • 这就是 Subject.doAsSubject.doAsPrivileged 方法已经做的事情。 :) 除了,Permission 获取被委托给Policy,它根据AccessControlContext 中每个ProtectionDomainPrincipals 和/或CodeSource 进行响应。
    猜你喜欢
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多