4

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

如何进入某种全局 JAAS 注册表并执行(伪代码) globalRegistry.getUser("Fred").getPrincipals()?(请注意,在 JAAS 中,角色由Principal表示。)

我知道如何从LoginContext获取Subject的Principal, 但这有两个问题。

  1. 只是在登录的那一刻,我不希望自己编写上述注册表并存储SubjectPrincipal对象,因为它们已经由 appserver 存储。
  2. 最好,即使 Fred 不是当前用户,我也希望能够访问此信息。

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

4

5 回答 5

5

我看到的一个模式是:

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

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

在Apache JackrabbitRepositoryImpl中使用了一个示例。它在extendAuthentication方法中,其工作是确定当前线程在创建新会话时具有哪些 Jackrabbit 权限(我认为)。

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

于 2012-01-06T23:31:31.677 回答
3

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

编辑: ThreadLocal 的返回是当前用户的主题。

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

于 2009-02-09T17:35:18.493 回答
1

对我来说,这似乎将appsever 的用户、组等与J2EE 应用程序角色混为一谈。

  • 获取认证用户的权限是一项管理任务,通常必须使用特定于应用服务器的 API 来完成。
  • JAAS 编程模型适用于更高层次的抽象。它仅提供用户是否属于 J2EE 角色的信息(在应用程序中定义)
于 2009-02-09T17:29:33.950 回答
1

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

于 2010-05-25T14:34:22.120 回答
0

在 EJB 中使用

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

context.lookup("java:comp/EJBContext"并在任何时候尝试使用)。


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

于 2014-03-07T10:06:07.093 回答