我可能对JAAS不太了解。我开始研究JAAS,因为我需要为应用程序提供自定义的LoginModule。

但是,每当我看到一个LoginModule的示例时,它们总是将主题定义为私有/受保护的字段,可以在方法之间进行访问。

所以我的问题是:LoginModule实例的范围是什么?是否可以确保始终在其他方法之前调用initialize的单例?还是每个经过身份验证的主题都有一个LoginModule?完全不同吗?

作为奖励问题? JAAS如何处理会话?我在任何地方都找不到会话ID(尽管我可能错过了一个很明显的地方)

最佳答案

LoginModule实例的范围是什么?

它取决于创建/管理模块的组件。

在Java SE中,SPI的典型用途是通过LoginContext类,默认情况下,在委托给它们的login方法之前,该类默认延迟地实例化和初始化其每个configured模块一次。随后,上下文将保留对相同模块实例的引用,直到将其处置为止。因此,模块的生命周期取决于其封装上下文的生命周期。而且,由于上下文的Subject同样只设置了一次,因此上下文的模块可以(为了满足其合同而实际上必须如此)安全地引用它,直到它们的“时间结束”为止。

只要模块由标准登录上下文管理,上述合同及其承诺自然就成立。例如,如果应用程序选择直接与模块进行交互,则它还必须承担遵守标准登录上下文协议的责任,或者对模块实现施加其他要求。后者是Java EE中经常发生的情况,供应商(在本例中为Java SE应用程序)可能要求模块从其自己的类派生和/或带有非标准配置。

JAAS如何处理会话?

不会1。它的设计并不是真正考虑到网络身份验证的。它与Servlet和EJB等框架的集成也没有标准化。

作为标准,JAAS寻求“公正”两件事:


成功通过身份验证后,使用Principal和凭据填充主题。
Augment线程具有这些主体的call stacks,以便以后可以基于主体和特定代码的authorization(分别是trustworthiness cc>源自ProtectionDomain,由http://example.com"Fred"签名,并且包含声明方法"Alice"的特定调用的类,该类在代表foo()标识的实体执行时被授予指定的Permission > s {Principal"Gill"}?)。


除了这两个之外,会话,网络协议消息,身份验证流程,Java EE角色以及您所拥有的东西都是非标准的,并由使用JAAS的应用程序或框架自行决定。在Java EE numerous中,已经对efforts进行了标准化years,试图弥合Java SE aka JAAS沙箱和Java EE安全模型之间的差距。



1如果我们与Web应用程序领域稍有距离,我们可以查看"HR Manager"(如果与一个或多个线程相关联)和LoginContext(与已验证的AccessControlContextSubject组合在一起)之一,以便携带有意义的授权语义)作为一种会话。但是,将这些方法绑定到某个Web应用程序(框架)中的所有可能方法与标准JAAS无关。例如,在Servlet设置中,身份验证和授权是由应用程序管理的,可以将Principal或其封装的LoginContext作为属性附加到SubjectHttpSession;或者Servlet容器本身可以在幕后使用HttpServletRequest以便将在容器管理的身份验证期间建立的主体与为请求提供服务的线程(以及扩展请求本身)相关联。

10-08 13:56