- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们目前正在使用JBoss EAP 6.4 / 7.0来采用JAAS和JACC。简要说明一下我们如何应用事物:
我们使用HttpServletRequest.login(...)
进行身份验证
随后,我们使用HttpServletRequest.logout()
注销。
我们有一个LoginModule,用于验证凭据并准备角色。
一切都很好,但是,我的应用程序的一部分必须允许一组特定的用户能够:
撤销其他人的角色以登录系统,并且
将他们踢出任何当前活动的会话。
第一部分很简单,但是我很难弄清楚如何使某人的会话无效。我有办法以某种方式掌握其他用户的主题/会话并使它无效吗?
非常感激
最佳答案
注意事项:
认证机制(AM)在本文中是指负责在Java EE运行时中使用/进行与认证的调用方实体有关的身份验证语句并由此注册/建立其身份的任何组件。这样的组件可能特定于应用服务器(AS)或Java EE标准。用于Java EE应用程序开发人员扩展的AS实现细节或类型;部署为Java EE应用程序的一部分或AS的一部分。这样的组件之一就是您的JAAS LoginModule
(LM)。身份存储(IS)似乎是当今(除其他外)用于指代LM的(半)规范性术语,但我想将其保留给您的特定于应用程序的持久层(例如JPA @Entity
)类型,该类型表示您的用户,因此必须建立这种(不确定的)区别。您可能会问:“您为什么要含糊?”您不能只将LM称为LM吗?因为我对JBoss LM一无所知!实际上,我既不是JBoss用户,也不是在Java EE中使用JAAS的人。尽管如此,我还是觉得我可以为适用于一般情况的问题做出贡献,因此不可避免地会产生模糊性。
由于缺乏更好的用语,已停用的用户是指您的“被踢出用户”,即,其权限(组,角色,权限(无论在那里被调用)的用户)已被撤销的用户在IS层面上有所不同。
首先,没有标准的Java EE API会将任意用户的Subject
或HttpSession
公开给您的代码。从理论上讲,您可以自己记录该信息,例如在身份验证期间,但是我将假定这不是您想要的。此外,特别是关于Subject
,尽管没有任何标准明确地禁止代表Principal
的请求在服务期间修改其(Subject
/凭据集合),但是没有一个标准指出必须是。实际上,甚至还不清楚当前通过身份验证的调用方的Subject
(在身份验证期间填充并可以通过JACC的"javax.security.auth.Subject.container"
PolicyContextHandler
检索的那个)是否必须与运行时查询Policy
时使用的数据结构一致。授权决定;也就是说,运行时可能只为您提供一个副本,或者在内部使用完全不同的身份验证调用方表示形式,或二者之间的任何方式。因此,即使您能够修改Subject
,这样做也不一定会影响有效的安全上下文。
前进到可以做什么。您的需求可以在身份验证和/或授权方面得到解决,前一种方法比后一种方法要容易得多。由于您未回答我的评论,因此我将简要介绍其两个可能的答案。
禁止呼叫者重新认证
一旦应用程序停用了用户,它就必须以某种方式指示AM停止对他们发出的后续请求进行重新认证。为了减少耦合,应用程序通常将不直接与AM通信,而是满足后者评估的某些条件。例如,应用程序可能为用户分配了一些特殊的“ locked_out”权限,或者设置了HttpSession
属性。当要求重新认证已停用的用户时,AM将确认已停用并拒绝对其进行重新认证。随后,它将使用户会话无效。它到底将如何完成取决于它的种类和实现。为此,您的LM可能必须利用"javax.servlet.http.HttpServletRequest"
JACC PolicyContextHandler
。 JASPIC ServerAuthModule
作为validateRequest
自变量接收到请求实例后,便可以立即访问该请求实例。某些其他组件可能不得不诉诸于使用AS内部构件,或者使应用程序承担会话无效的责任(某些呼叫拦截组件,例如Servlet Filter
,将不得不第二次查询IS并采取行动。相应地)。
前述方法显然需要修改AM功能的能力。另外,缓存AM需要在重新使用其先前建立的认证结果之前评估所述停用条件。最后,如评论中所述,如果在用户的IS访问撤消时,代表该用户的请求正在接受服务(在发生访问撤消事件之前已到达/已通过身份验证) ,则该请求的服务将正常完成(除非应用程序例如通过HttpServletRequest#
(login
| authenticate
)请求对该用户进行重新认证。
禁止呼叫者重新授权
正如我在开始时提到的那样,虽然用户的Subject
很难被检索/修改,但在符合JACC的Java EE运行时上,这些Policy
实际上是被授权的。不幸的是,默认的AS提供的JACC提供程序(PolicyConfiguration
+ Policy
)有一个严重的限制:它仅允许您在Java EE角色上进行操作,而不能在映射到(即“具有”)调用方Principal
上进行操作,这些角色。例如,默认提供程序允许您扩展映射到“ admin”角色的Permission
所具有的Principal
。它允许您删除“ admin”角色及其所有Permission
;但是它不允许您决定谁将成为“管理员”,至少不能以标准方式。
就JACC而言,此限制基本上为您提供了两种选择:让AM向每个呼叫者的Principal
添加一个“虚拟”组Subject
,其名称与各自呼叫者的Principal
相同。然后,在停用用户后,添加(通过PolicyConfiguration#addToRole
)与“虚拟”组有关的custon Permission
。最后,从“应用程序空间”代码中检查(例如,通过AccessController#checkPermission)用户是否具有Permission
,如果有,将其踢出。但是,等等,这是完全没有意义的,如果它不能自行处理授权,为什么还要首先使用Policy
?另一种方法是编写并安装自己的JACC提供程序。这样做将使您能够完全控制Principal
-/组到角色的映射,并使您可以采取任何行动,但是您可以在以后的授权时间范围内使用该信息。但是,编写新的提供程序并非易事,特别是因为它必须满足JRE范围内的授权需求,而不仅仅是在单个应用程序的范围内。我怀疑您的要求是否足以证明如此高的工作量。如果您仍然想走这条路,那么关于Arjan Tijms的blog的JACC相关文章就是一个很好的起点。
关于java - JAAS&JACC:如何将用户赶出去?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40233679/
我正在尝试在 Tomcat 7 上实现一个具有领域配置的简单 JAAS 模块。我正在尝试基于以下链接实现它: http://www.byteslounge.com/tutorials/jaas-aut
我想一个使用 NTLoginModule 进行身份验证的 jaas.conf 文件示例会有所帮助。 最佳答案 我不确定那是不是你的意思,但我想你可以: SomeName { com.sun.se
我正在使用这个 Helm chart :https://github.com/helm/charts/tree/master/incubator/kafka 以及 values.yaml 中的这些覆盖
我试图弄清楚登录模块标志在 JAAS 中是如何工作的(使用 JBoss 5.1 EAP),我遇到了一个令人费解的情况,我希望有人能为我澄清一下。 对于背景,我的 login-config.xml 如下
我实现了一个通过 Web 服务访问的自定义 loginModule,并在 JPA 访问的 DB 前面检查用户名和密码。 我在 jboss 7.1 上运行它,它运行良好,但是在将它移动到 Wildfly
我想知道使用 对数据库表上的应用程序用户进行身份验证的最简单方法贾斯 . 由于带有用户名/散列密码的数据库表可能是最常见的解决方案,是否有“提供”的 LoginModule 用于这种身份验证? 最佳答
我有以下代码来运行 Java (SE) 应用程序(不在服务器上),其中应该使用运行 JAAS 身份验证的现有 JBoss 服务器(我绑定(bind)到 4.2.3)来完成登录。我从一个简单的控制台应用
我刚刚完成了本教程: http://java.sun.com/docs/books/tutorial/security/tour2/index.html 并且对 JAAS 的基本概念感到好奇...如果
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我正在尝试设计一个 JAAS 微服务来处理多个 J2EE 应用程序的用户身份验证。目前我们有多个应用程序根据我们的 LDAP 进行身份验证并具有单独的角色系统。现在我一直在设计应用程序和身份验证后端之
我有一个带有 JAAS 的应用程序,我需要从遗留系统进行外部登录,所以我用下面的代码编写了一个 servlet,它工作正常,但是当我再次提交时,JAAS 尝试再次进行身份验证并失败,并且用户被重定向到
我正在学习 Java 安全 JCE/JAAS。我无法获得我们需要在实际 Web 应用程序中实现 JAAS 登录模块的示例。 任何人都可以指导我在我的 Web 应用程序中实现 JAAS 的位置吗?据我所
我关注了this tutorial学习JAAS。这个例子对我有用,所以我创建了自己的版本(我使用的是 Tomcat 6 和 Java 6),但我无法让它工作(帖子底部的异常)。 (由于代理,我无法将
我们有一个新编写的 JAAS 模块,想知道将 DataSource 对象的数据库连接设置放在哪里。 通常在 Tomcat 网络应用程序中,这将在“web.xml”文件中引用以指向位于“$catalin
嗨,我正在使用这个 link对于基于 Java JAAS 表单的身份验证, JAAS 登录模块的实现使用数据库(postgresql)验证用户输入的用户名和密码 在 JAAS 中,我们应该创建“jas
在 WildFly 9 服务器上运行的 Java EE 应用程序中,我有一个自定义登录模块: public class MyLoginModule extends AbstractServerLogi
我正在尝试编写我的 Costum LoginModule,以便在具有基本授权的 REST 服务中使用。为此我做了以下工作: 我编写了自己的 LoginModule,称为 QuarkLoginModul
我想知道如何结合这两个身份验证步骤: 检查 LDAP 中的用户/密码 将在数据库中找到的主体(角色)添加到主题。 LDAP 用户存储库不知道应用程序特定的角色,我不想管理应用程序数据库中的密码。所以我
我在 jboss 上有一个自定义登录模块。 ear 的 META-INF 有一个指向 login-service.xml 的 jboss-app.xml,后者包含一个指向定义自定义登录模块的 logi
我很难理解 JAAS。这一切似乎都比应有的复杂(尤其是 Sun 教程)。我需要一个简单的教程或示例,说明如何在基于 Struts + Spring + Hibernate 和自定义用户存储库的 jav
我是一名优秀的程序员,十分优秀!