一个JACC提供者如何使用所部署服务器的主体到角色映射功能?

154

我正在编写一个 JACC 提供程序。

在此过程中,这意味着要实现 PolicyConfiguration

PolicyConfiguration 负责接受应用服务器的配置信息,例如哪些权限归属于哪些角色。这样一来,Policy 会在稍后处理 关于当前用户及其尝试执行的操作的信息 时做出授权决策。

然而,维护角色及其权限以及分配给这些角色的 Principals 的映射不是 PolicyConfiguration (可怕的)合同的一部分。

通常情况下 - 实际上总是如此 - 应用服务器存储此映射关系。例如,在 Glassfish 上,您可以通过为 Java EE 模块提供诸如 sun-web.xmlsun-ejb-jar.xml 等内容来影响此映射。 (这些特定于供应商的文件负责说明,例如 superusers 是要分配应用程序角色 admins 的组。)

我希望重用这些文件提供的功能,并且希望为尽可能广泛的应用服务器执行此操作。

以下是IBM对此问题的看法,完全是主观臆断,但似乎证实了我的怀疑:我想做的基本上是不可能的。这更加支持了我认为这份Java EE合同不值一文的论点。

我的问题:如何在Glassfish和JBoss中从PolicyConfiguration内部获取此主体到角色映射信息?如果有我不知道的标准方法,我非常愿意听取建议。


7
你在这个问题上有进展了吗?我也想编写一个 JACC 提供程序,并且还要编写一个 JASPIC 认证提供程序,以便构建可移植的网络应用程序... - perissf
2
目前我的看法是,你必须始终确保你的JACC提供程序与你因此也被迫编写的JASPIC提供程序耦合。我还没有走这条路,但我打算尝试一下。 - Laird Nelson
5
嗨,不想让任何人等太久。 :-) 我没有即时提供答案的能力。我只记得Ron Monzillo建议我,要让主角色分配“传输”到JACC提供程序并被其理解的唯一方法是使JASPIC实现与其有效地耦合。 - Laird Nelson
你可以简单地解析配置文件,但这将限制你只能在特定的应用服务器上运行,并且/或者可能需要确定你所运行的服务器,或检查不同的文件... - zuloo
重新审视JACC,我在想我们是否可以在规范中做类似的事情,而不需要新代码甚至维护版本:如果强制要求将作为“String”的定界主体名称集传递给“PolicyContext#getContext(String)”并确保如果存在适当的策略上下文处理程序,则会返回相应角色的“Set <String>”?没有新接口,也没有向后兼容性问题。没有比已经需要进行的EJBMethodPermission的现有字符串解析更粗鲁的东西。 - Laird Nelson
显示剩余5条评论
1个回答

3
简短回答是:没有标准的方法来完成这个任务。
尽管Glassfish和JBoss支持主体到角色的映射,但JACC并不假设所有容器都支持,因此将保持这些映射的责任委托给JACC提供程序实现。从文档中可以看出(请参见:PolicyConfiguration.addToRole method):
“它是策略提供程序的工作,确保添加到角色的所有权限都授予了'映射到该角色'的主体。”
换句话说,您需要在每个容器的JACC提供程序内部自己实现这个功能。例如,对于JBoss,您可以使用AbstractRolesMappingProvider的子类之一。

另外,可移植的提供者可以选择忽略容器角色映射;例如,它可以假定任何主体都意味着相同名称的应用程序角色,除非应用程序以某种方式(例如通过专门为此目的注册的PolicyContextHandler)传达其他信息。另一个提供者也可以完全忽略角色概念(因此不使用容器提供的PolicyConfiguration),而只在(应用程序提供的)主体与权限映射上操作(这些权限不必局限于JACC的权限)。 - Uux
附注2:自Java EE 8起,1:1的组到角色映射已成为新的默认设置(不过这仅让我们走了一半路程,因为角色仍然必须静态地预先声明--假设没有自定义JACC提供程序生效)。 - Uux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接