Java Jaas LoginModule作用域和会话处理

Java Jaas LoginModule作用域和会话处理,java,jaas,Java,Jaas,我可能只是在JAAS上走错了路。我开始研究JAAS,因为我需要为应用程序提供自定义LoginModule 但每次我看到LoginModule的示例时,它们总是将主题定义为私有/受保护字段,在方法之间访问 所以我的问题是:LoginModule实例的范围是什么?它是一个保证总是在其他方法之前调用initialize的单例吗?或者每个经过身份验证的主题是否都有一个LoginModule?这是完全不同的吗 作为一个额外的问题?JAAS如何处理会话?我在任何地方都找不到sessionID(尽管我可能错过

我可能只是在JAAS上走错了路。我开始研究JAAS,因为我需要为应用程序提供自定义LoginModule

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

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

作为一个额外的问题?JAAS如何处理会话?我在任何地方都找不到sessionID(尽管我可能错过了非常明显的地方)

LoginModule的实例的范围是什么? 它取决于创建/管理模块的组件

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

只要模块由标准登录上下文管理,上述契约及其承诺自然有效。例如,如果应用程序选择直接与模块交互,它还必须承担这样做的责任,同时遵守标准登录上下文的协议——或者对模块实现提出进一步的要求。后者是JavaEE中经常发生的情况,其中供应商(在本例中为JavaSE应用程序)可能要求模块从其自己的类派生和/或伴随非标准配置

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

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

  • 成功验证后,使用
    主体和凭据填充主题
  • 线程与这些主体一起执行,以便以后可以基于主体和特定代码(是源自
    ProtectionDomain的
    ProtectionDomain)在单个调用堆栈帧的粒度范围内执行http://example.com
    ,由
    “Fred”
    “Alice”签名
    ,并包含声明方法
    foo()
    的特定调用的类,当代表
    主体
    s{
    “Gill”
    “HR Manager”
    )标识的实体执行时,授予指定的
    权限
除了这两个方面之外的任何东西——会话、网络协议消息、身份验证流、JavaEE角色等等——都是非标准的,由使用JAAS的应用程序或框架决定。在JavaEE标准化的过程中,人们一直在努力弥合JavaSE(又名JAAS,又名沙箱)和JavaEE安全模型之间的差距


1如果我们稍微远离web应用程序领域,我们可以查看
LoginContext
(如果与一个或多个线程关联)和
AccessControlContext
(首先与经过身份验证的
主题的
主体的
主体的
主体的
,以便携带有意义的授权语义)作为一种会议。然而,所有可能的将这些绑定到某个web应用程序(框架)的方法都与标准JAA无关;e、 例如,在Servlet设置中,身份验证和授权由应用程序管理,可以将
LoginContext
或其封装的
Subject
作为属性附加到
HttpSession
HttpServletRequest
;或者Servlet容器本身可以在封面下使用
AccessControlContext
,以便将容器管理的身份验证期间建立的主体与服务于请求的线程(并通过扩展请求本身)相关联