0

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

我有一个页面,其中的文字是“登录为”。应由 ManagedBean 使用 getCurrentUserPrincipal() 方法设置。

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

该方法当前为空。我用WSSubject.getCallerPrincipal()FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal()进行了尝试,但返回 null。我怎样才能用这种方法获得我需要的信息?甚至可能吗?我不确定您需要什么信息,因此如果缺少某些信息,我会尽可能提供。

4

2 回答 2

0

经过一番挖掘,我发现我们的身份验证服务器是一个站点管理器服务,信息以 cookie (SMSESSION) 和响应的标头信息的形式返回。因此,读取标题信息以获取用户名就足够了。

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

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

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

于 2018-01-05T08:21:37.240 回答
0

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

@Inject
private Principal principal;

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

public String getCurrentUserPrincipal() {
    return principal.getName();
}
于 2017-12-27T16:17:35.557 回答