Java 如何将JAAS授权检查委托给Shiro?
我正在开发一个需要基于对象的身份验证和授权的服务器端应用程序。我喜欢Shiro的简单性,但为了与JAAS兼容,我编写了一个LoginModule,它使用ApacheShiro作为底层机制Java 如何将JAAS授权检查委托给Shiro?,java,authorization,authentication,jaas,shiro,Java,Authorization,Authentication,Jaas,Shiro,我正在开发一个需要基于对象的身份验证和授权的服务器端应用程序。我喜欢Shiro的简单性,但为了与JAAS兼容,我编写了一个LoginModule,它使用ApacheShiro作为底层机制 但我的问题是,我找不到将JAAS授权检查委托给Shiro的方法。如何实现这一点?注意:答案涉及通过标准安全框架将外部授权系统与JVM集成的一般情况。它不是Shiro或JMX特定的,因为我对两者都不熟悉 从概念上讲,您似乎是在策略决策点(PDP)之后——也就是说,授权查询(“实体X允许做Y吗?”)是在这个工具上
但我的问题是,我找不到将JAAS授权检查委托给Shiro的方法。如何实现这一点?注意:答案涉及通过标准安全框架将外部授权系统与JVM集成的一般情况。它不是Shiro或JMX特定的,因为我对两者都不熟悉
从概念上讲,您似乎是在策略决策点(PDP)之后——也就是说,授权查询(“实体X允许做Y吗?”)是在这个工具上进行评估的。JDK提供了以下几种:
checkXXX
方法组意味着(权限)
方法意味着(ProtectionDomain,Permission)
有效的方法意味着、、和的方法
1.仅基于SNAS的授权
javax.security.auth
SPI进行身份验证,请忘记将标准主题
作为身份验证结果,而直接将特定于Shiro的主题绑定到线程本地存储。通过这种方式,您可以更方便地访问SNAAs,并避免使用AccessControlContext
(并承受潜在风险)进行检索
SecurityManager
,至少重写两个checkPermission
方法,以便
Permission
参数翻译成Shiro的PDP(SPDP)理解的内容,然后SecurityException
)System::setSecurityManager
)您的实现
2.混合授权,将源代码与上下文不敏感的SNAAs相结合
主题
与线程本身关联起来SecurityManager
,至少覆盖两个checkPermission
方法,这一次,使它们同时委托给SPDP和/或被覆盖的实现(后者相应地调用当前或提供的访问控制上下文上的checkPermission
)。对于任何给定的许可,应咨询哪一个(或多个)以及以何种顺序进行咨询,这当然取决于实施情况。当两者都被调用时,应该首先查询SPDP,因为它的响应速度可能比访问控制上下文更快策略
子类化,实现暗示(ProtectionDomain,Permission)
,这样,与上面的SecurityManager::checkPermission
类似,它向SPDP传递一些可理解的域表示(通常只传递其CodeSource
)和权限参数(但逻辑上不传递SNAAs)。该实现应尽可能高效,因为它将在checkPermission
时间为每个访问控制上下文的每个域调用一次。实例化并安装(Policy::setPolicy
)您的实现3.混合授权,将源代码与SNAAs相结合,两者都是上下文敏感的
ThreadLocal
那样简单
策略
,该策略执行安全管理器::检查权限
和策略::暗示
的组合职责,如第二种情况中所述
SecurityManager
ProtectionDomain
子类capab