我可能只是在JAAS上错了。我开始研究JAAS,因为我需要为应用程序提供自定义的LoginModule。
但是每当我看到一个LoginModule的例子时,他们总是将主题定义为私有/受保护字段,可以在方法之间访问。
所以我的问题是:LoginModule实例的范围是什么?它是一个单例,它保证在其他方法之前总是调用初始化吗?或者每个经过身份验证的主题是否有LoginModule?这是完全不同的东西吗?
作为奖金问题? JAAS如何处理会话?我无法在任何地方找到sessionID(虽然我可能错过了一个非常明显的地方)
答案 0 :(得分:3)
LoginModule
的实例范围是什么?
这取决于创建/管理模块的组件。
在Java SE中,SPI的典型/预期用法是通过LoginContext
类,默认情况下,在委托给他们之前,懒惰地实例化并初始化每个configured模块。 login
方法。随后,上下文保留对相同模块实例的引用,直到它被处置为止。因此,模块的生命周期取决于其封装上下文的生命周期。由于上下文的Subject
同样只设置一次,因此上下文的模块可以(它们实际上必须以满足其合同)安全地引用它直到它们的“结束时间”。 / p>
只要模块由标准登录上下文管理,上述合同及其承诺自然就会成立。例如,如果应用程序选择直接与模块交互,则它还必须承担这样做的责任,同时遵守标准登录上下文的协议 - 或者对模块实现施加进一步的要求。后者是Java EE中常见的情况,其中供应商(在这种情况下读取:Java SE应用程序)可能要求模块派生自他们自己的类和/或伴随非标准配置。
JAAS如何处理会话?
它不是 1 。它的设计并没有考虑到网络身份验证。它与Servlet和EJB等框架的集成也没有标准化。
作为标准,JAAS寻求“只”两件事:
Principal
和凭据填充主题。ProtectionDomain
的{{1}},由http://example.com
和"Fred"
签名,并包含声明特定方法调用的类代表"Alice"
{foo()
Permission
} Principal
}?标识的实体执行后,"Gill"
授予指定的"HR Manager"
。 除了这两个会话,网络协议消息,身份验证流程,Java EE角色以及您拥有的内容之外的任何内容都是非标准的,并且由使用JAAS的应用程序或框架自行决定。在Java EE numerous标准化efforts已经在years上进行,试图弥合Java SE又名JAAS aka沙箱和Java EE安全模型之间的差距。
1如果我们稍微远离Web应用程序领域,我们可以查看LoginContext
(如果与一个或多个线程相关联)和AccessControlContext
(与经过身份验证相结合) Subject
的{{1}}首先是Principal
,以便携带有意义的授权语义)作为一种会话。然而,将这些可能与某些Web应用程序(框架)绑定的所有可能方式与标准JAAS无关;例如,在Servlet设置中,身份验证和授权由应用程序管理,一个可以将LoginContext
或其封装的Subject
作为属性附加到HttpSession
或HttpServletRequest
;或者Servlet容器本身可以使用封面下的AccessControlContext
,以便将在容器管理的身份验证期间建立的主体与为请求提供服务的线程相关联(并通过扩展请求本身) )。子>