Java JAAS&;我怎样才能把用户踢出去?

Java JAAS&;我怎样才能把用户踢出去?,java,jboss,jaas,jacc,Java,Jboss,Jaas,Jacc,我们目前正在使用JBoss EAP 6.4/7.0采用JAAS和JACC。简单介绍一下我们是如何应用的: 我们使用HttpServletRequest.login(…)进行身份验证 随后,我们使用HttpServletRequest.logout()注销 我们有一个LoginModule,用于验证凭据并准备角色 一切都很好,但是,我的应用程序的一部分必须允许某些用户能够: 撤消其他人登录系统的角色,然后 将他们从任何当前活动的会话中踢出 第一部分很简单,但我很难找出如何使某人的会话无效我

我们目前正在使用JBoss EAP 6.4/7.0采用JAAS和JACC。简单介绍一下我们是如何应用的:

  • 我们使用
    HttpServletRequest.login(…)
    进行身份验证
  • 随后,我们使用
    HttpServletRequest.logout()
    注销
  • 我们有一个LoginModule,用于验证凭据并准备角色
一切都很好,但是,我的应用程序的一部分必须允许某些用户能够:

  • 撤消其他人登录系统的角色,然后
  • 将他们从任何当前活动的会话中踢出
第一部分很简单,但我很难找出如何使某人的会话无效我是否有办法获得其他用户的主题/会话并使其无效?

非常感谢

术语说明:

  • 本文中的认证机制(AM)是指负责在javaee运行时中制作与认证调用方实体相关的认证语句并注册/建立认证调用方实体的身份的任何组件。这些组件可能特定于应用服务器(AS)或Java EE标准;作为Java EE应用程序开发人员要扩展的实现细节或类型;作为JavaEE应用程序的一部分或as的一部分部署。其中一个组件是您的JAAS
    LoginModule
    (LM)。虽然Identity Store(IS)似乎是目前用于指代(除其他外)LMs的(半)规范性术语,但我想将其保留为代表用户的特定于应用程序的持久层(例如JPA
    @Entity
    )类型,因此必须建立这种(定义不清的)区别。“你为什么含糊其辞?”你可能会问,“你能不能把一个LM叫做LM?”。因为我对JBoss LMs一无所知!事实上,我既不是JBoss用户,也不是在JavaEE中使用JAAS的人。尽管如此,我还是觉得我可以提供一个适用于一般情况的答案,因此不可避免的含糊不清
  • 由于缺少更好的术语,Deactivated user指的是您的“被踢出的用户”,即其权限(组、角色、权限——无论在那里被称为什么)在IS级别以某种方式被撤销的用户

首先,没有标准的JavaEEAPI可以将任意用户的
主题
HttpSession
暴露给您的代码。理论上,您可以自己记录该信息,例如在身份验证期间,但我假设这并不是您想要的。此外,特别是关于
主题
,虽然没有任何标准明确禁止其(
主体
/credential collection)在代表
主题
服务请求期间进行修改,但没有任何标准规定必须进行修改。事实上,甚至不清楚当前经过身份验证的调用方的
主题是否为
——即在身份验证期间填充的主题,可通过JACC的
“javax.security.auth.Subject.container”检索
PolicyContextHandler
——在做出授权决策时,必须与运行时查询
策略的数据结构一致;也就是说,运行时可能只向您提供一个副本,在内部使用完全不同的身份验证调用方表示,或者介于两者之间的任何内容。因此,即使您能够修改
主题
,这样做也不一定会影响有效的安全上下文

继续讨论可以做什么。您的需求可以在身份验证和/或授权方面得到解决,前者比后者更容易使用。由于你没有回答我的评论,我将简要介绍这两个可能的答案

禁止呼叫方重新身份验证

一旦应用程序停用了用户,它必须以某种方式指示AM停止对其发出的后续请求进行重新身份验证。为了减少耦合,应用程序通常不会直接与AM通信,而是满足后者评估的某些条件。例如,应用程序可能会将一些特殊的“锁定”权限分配给用户,或者设置一个
HttpSession
属性。当要求重新验证停用的用户时,AM将确认停用并拒绝重新验证他们。随后,它将使用户的会话无效。它将如何实现这一目标取决于它的种类和实施。您的LM可能需要利用
“javax.servlet.http.HttpServletRequest”
JACC
PolicyContextHandler
实现这一目的。JASPIC
ServerAuthModule
作为
validateRequest
参数接收请求实例后,可以立即访问该请求实例。其他一些组件可能不得不求助于使用AS内部构件,或者让应用程序承担会话失效的责任(一些调用拦截组件,例如Servlet
过滤器
,将不得不再次查询IS并相应地采取行动)

上述方法显然需要修改AM功能的能力。此外,缓存AM需要在重用其先前建立的认证结果之前评估所述失活条件。最后,如评论中所述,如果在用户的IS访问撤销时,代表该用户的请求正在被服务的过程中(在访问撤销事件发生之前已经到达/已经过身份验证),则该请求的服务将正常完成(除非应用程序请求重新验证该用户,例如通过
HttpServletRequest
login
|
authenticate

Prohi