我们的应用程序需要检查多个后端以进行身份验证和授权。
为此,我们为每个后端编写了一个LoginModule,现在最终得到一个具有多个Principal的主题。到目前为止,太棒了!
应用程序需要在运行时检查自定义权限。委托人是否具有该自定义权限取决于从特定后端获取的信息。在这里,我们几天都被困住了!
我们实现了自己的权限,并使用AccessController.checkPermission来检查这些。但是如何告诉JAAS实际授予的权限?没有什么比如我们可以在LoginModule中调用Principal.setPermissions()。
Acl和Group接口首先看起来很有前景,但被标记为已弃用,因此必须采用不同的方式。但是哪个?
有很多关于如何编写策略文件的教程,但这正是我们不需要的。相反,我们需要向后端询问主体的权限。而且,我们需要同时使用多个后端,并且每个后端只知道“它自己的”本机权限,但不知道是否允许特定代码打开套接字或文件 - 所以基于原始文件的策略仍然必须到位。
是否有任何JAAS专家可以告诉我们需要实现什么以及如何在运行时将其告知JAAS?
答案 0 :(得分:1)
我不是JAAS的真正专家,我还没有尝试过您的要求。 也许我的第一个想法对你有帮助。
javax.security.auth.SubjectDomainCombiner
创建Subject
。java.security.Permissions
相关联的所有Permission
填充新的Principal
。java.security.ProtectionDomain#ProtectionDomain(CodeSource, PermissionCollection, ClassLoader, Principal[])
将权限和主体与CodeSource
合并为null
,PermissionCollection
是在第2步中创建的Permissions
实例。 Principal
数组与Principal
相关联的所有Permissions
。AccessControlContext
合并当前(来自实际ProtectionDomain
)和新javax.security.auth.SubjectDomainCombiner#combine(ProtectionDomain[], ProtectionDomain[])
。java.security.AccessControlContext#AccessControlContext(AccessControlContext, DomainCombiner)
和AccessControlContext
SubjectDomainCombiner
醇>
请改为使用以下代码中的AccessControlContext
(第4步)。
希望有所帮助。