我想访问用户的完整模型及其在 SOAP 应用程序中的角色。例如,我可能想知道名为“Fred”的用户的角色。

我如何访问某种全局 JAAS 注册表并执行操作(伪代码) globalRegistry.getUser("Fred").getPrincipals()?(请注意,在 JAAS 中,角色由 主要的.)

我知道如何获得 主要的主题 来自 登录上下文, ,但这有两个问题。

  1. 仅在登录时,我不想对上述注册表进行编码并存储 主题主要的 我自己的对象,因为它们已经由应用程序服务器存储。
  2. 最好,即使 Fred 不是当前用户,我也希望能够访问此信息。

我正在使用 Jetty,但我认为这些行为是 JAAS 的标准行为。

有帮助吗?

解决方案

我们使用 ThreadLocal 变量来引用当前用户,该用户已在系统入口点(在我们的例子中为 servlet 或 ejb)进行了身份验证。这允许对当前用户进行“全局”访问。这不直接与 JAAS 或任何其他安全协议相关,但可以从它们初始化。

编辑:ThreadLocal 的返回值是当前用户的Subject。

访问其他用户通常是通过某种类型的管理模块来完成的。

其他提示

我看到的一个模式是:

AccessControlContext acc = AccessController.getContext();
Subject subject = Subject.getSubject(acc);
Set<Principal> principals = subject.getPrincipals();

本质上,这会找到当前与当前线程关联的主题,并询问其主体。

使用这一点的一个例子是 阿帕奇长耳大野兔存储库实现. 。它位于 extendAuthentication 方法,其工作是确定当前线程在创建新会话时拥有哪些 Jackrabbit 权限(我认为)。

然而,我应该指出,这可能不一定真正有效,至少在 J2EE 上下文中是这样。我在 JBoss AS7 下使用此代码,但它没有找到主题。不过,这可能只是一个错误。

对我来说,这似乎使应用程序的用户、组等变得更加混乱。具有 J2EE 应用程序角色。

  • 获取特定用户的权限是一项管理任务,通常必须使用特定于应用程序服务器的 API 来完成。
  • JAAS 编程模型适用于更高层次的抽象。它仅提供用户是否处于 J2EE 角色(在应用程序内定义)的信息

我相信 JAAS 的设计目的并不是真正允许您尝试做的事情。我知道在我构建的应用程序中,我需要那种功能,我必须回避 JAAS 并直接编程到任何实际的身份存储库,无论是 LDAP、ActiveDirectory 还是其他。

在 EJB 中使用

@Resource(mappedName = "java:comp/EJBContext")
protected SessionContext sessionContext;

并尝试与 context.lookup("java:comp/EJBContext")在任何一点。


此代码适用于 JBoss 服务器系列,供其他人在其 JNDI 中查找。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top