如何在 JSF 页面中从 Liberty 的基于 FORM 的身份验证中获取用户主体?

How to obtain user principal from Liberty's FORM based authentication in JSF page?

所以我有这个使用基于表单的身份验证的 JSF 项目。第一次尝试打开我的 JSF 页面时,我被重定向到我的登录服务器。在那里进行身份验证,成功后我被重定向到我的应用程序。不幸的是,我不知道如何获取身份验证服务器提供的信息,例如用户名。

我有一个页面,其中的文字是 "Signed in as "。应该由 ManagedBean 使用方法 getCurrentUserPrincipal() 设置。

<h:outputText value="#{myBean.getCurrentUserPrincipal()}"/>

该方法当前为空。我用 WSSubject.getCallerPrincipal()FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal() 尝试过,但返回了无效的。 我怎样才能用那种方法得到我需要的信息? 有可能吗? 我不确定您需要什么信息,所以如果缺少某些信息,我会尽可能提供。

将委托人注入到您的托管 bean 中,例如:

@Inject
private Principal principal;

然后,根据上面 outputText 字段的 html,在您的托管 bean 中提供一个 getter,例如:

public String getCurrentUserPrincipal() {
    return principal.getName();
}

经过一番挖掘,我发现我们的身份验证服务器是一个站点管理员服务,信息返回到 cookie (SMSESSION) 和 header 响应信息中。 所以,读取header信息就可以得到用户名了。

但是 principalsubject 仍然 return null。为了实现这一点并确保安全性,我向 Liberty 添加了一个 TAI。这是如何做到的,你可以阅读here and here。我的myTAI.jar真的很简单。因为我配置了 ldap 注册表,所以我需要给定用户名 (header) 的用户安全名称(字符串,例如 uid=..,ou=..,ou=..)以进行进一步的身份验证,并且 return这个:

return TAIResult.create(HttpServletResponse.SC_OK, userSecName);

在后台,Liberty 将做一些进一步的验证并创建原则和主题。如果一切都正确配置并且用户被授权进入应用程序,他将并且将有原则和主题 objects 可用。