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

时间:2017-12-22 15:24:42

标签: jsf websphere-liberty userprincipal open-liberty

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

我有一个文字正在说的页面"已登录为"。应该由ManagedBean使用getCurrentUserPrincipal()方法设置。

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

该方法目前为空。我尝试使用 WSSubject.getCallerPrincipal() FacesContext.getCurrentInstance()。getExternalContext()。getUserPrincipal()但返回null。 如何通过该方法获取所需信息? 它甚至可能吗? 我不确定您需要哪些信息,所以如果遗漏了某些内容,我会尽可能提供。

2 个答案:

答案 0 :(得分:0)

将主体注入您的托管bean,如:

@Inject
private Principal principal;

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

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

答案 1 :(得分:0)

经过一番挖掘后,我发现我们的身份验证服务器是一个siteminder服务,并且信息以cookie(SMSESSION)和响应的头信息返回。 因此,只需读取标题信息即可获取用户名。

主体主题仍会返回 null 。为了实现这一目标并使安全工作,我向Liberty添加了一个TAI。如何做到这一点,您可以阅读herehere。我的 myTAI.jar 非常简单。因为我配置了ldap注册表,所以我需要给定用户名(标头)的用户安全名称(字符串,例如uid = ..,ou = ..,ou = ..)以进行进一步的身份验证并返回:

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

在后台,Liberty将进行一些进一步的身份验证并创建原则和主题。如果一切都配置正确并且用户有权进入应用程序,他将会并且将拥有原则和主题对象。