4

我在 Glassfish 中配置了一个 LDAP 领域,并且身份验证工作得很好。

现在我想知道如何将 Principal.getName() 返回匹配到我的 LDAP 用户对象的某个属性。我认为默认情况下它会使用诸如“givenName”之类的东西,但它会返回用于身份验证的用户名。

我不介意额外访问 LDAP 服务器以获取附加信息,但我不想在我的应用程序中保留 LDAP 连接属性,而是想注入安全领域(如果可能的话)并使用它自己的连接。

所以,简而言之,问题是:

1) 我可以将其他属性映射到领域返回的 Principal 吗?

2)如果第一个是不可能的,那么我如何重用领域的信息以连接到 LDAP 服务器并获取我需要的数据?

提前感谢您的任何帮助或建议。

4

3 回答 3

2

JAAS 主题通常包含许多主体,每个主体代表一个不同的属性。

对于 Java EE,只有一个 Principals 被选择用于调用 HttpServletRequest#getUserPrincipal 和类似方法时返回的那个。其他 Principals 用于刚刚丢失的 Java EE API。

如果登录是通过 HTTP 或 SOAP 发生的,您可以通过编写 JASPIC 身份验证模块来确定要选择哪些 Principal。

您可以通过从 JASPIC 身份验证模块中将其放入 HTTP 会话来保留整个主题。其他代码可以从那里获取它。

于 2013-08-30T09:01:56.497 回答
2

编辑:我的印象是以下内容曾经可以工作,至少在 GlassFish 4.0 中是这样。不幸的是,情况(不再)似乎不是这样。可以在此问题的评论中找到解决方法。

本身并不是真正的解决方案;只是我一直忽略了一段时间的一个小细节,现在我意识到了这一点,这让我松了一口气。所以——跳过无聊的细节——我意识到还有一个CallerPrincipalCallback(Subject s, Principal p)构造函数可用,当提供我的 custom 时Principal,它会导致服务器实际保留它,而不是将其包装或转换为内部 GlassFish 实现实例,如我之前以为会。然后,我可以从“用户空间”以通常的方式(例如,等等)访问我的“丰富”(老实说,更多)版本Subject,投射它并享受不必关心派生定制的便利从现在开始,每个应用程序中的通用应用程序 s :) 。PrincipalExternalContext#getUserPrincipalPrincipal

于 2015-03-02T00:22:57.087 回答
1

好吧,如果不使用自定义 LoginModule,我就无法扩展 Principal 属性映射;所以,我选择了这里描述的解决方案:http: //docs.oracle.com/cd/E19798-01/821-1751/abllk/index.html

我所做的是,在身份验证后,使用注入的 LDAP 上下文返回 LDAP 服务器并获取我想要的属性。缺点很明显:两次访问服务器而不是一次,以及探测属性并以某种方式将它们绑定到 Principal(或另一个 POJO)的额外代码。

于 2013-08-31T16:58:32.727 回答