- 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/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!