所以我有这个使用基于表单的身份验证的JSF项目。在第一次打开我的JSF页面时,我被重定向到我的登录服务器。在那里进行身份验证,成功后我被重定向到我的应用程序。不幸的是,我不知道如何获取身份验证服务器提供的信息,如用户名。
我有一个页面,文字说“登录为”。应该由Managed Bean使用getCurrentUser Principal()方法设置。
<h:outputText value="#{myBean.getCurrentUserPrincipal()}"/>
该方法目前是空的。我尝试使用WSSubject.getCallerPrincipal()和FacesContext.getCurrentInstance()。getExternalContext()。getUserPrincipal()但返回null。如何通过该方法获取所需信息?它甚至可能吗?我不确定你需要什么信息,所以如果缺少某些东西,我会尽可能地提供。
将主体注入托管bean,如:
@Inject
private Principal principal;
然后,基于你的输出文本字段上面的html,在你的托管bean中提供一个getter,如:
public String getCurrentUserPrincipal() {
return principal.getName();
}
经过一番挖掘后,我发现我们的身份验证服务器是一个siteminder服务,并且信息以cookie(SMSESSION)和响应的头信息返回。因此,读取头信息以获取用户名就足够了。
但是校长或主题仍然会返回null。为了实现这一目标并使安全工作,我向Liberty添加了一个TAI。如何做到这一点,你可以阅读here和here。我的myTAI.jar非常简单。因为我配置了ldap注册表,所以我需要给定用户名(标头)的用户安全名称(字符串,例如uid = ..,ou = ..,ou = ..)以进行进一步的身份验证并返回:
return TAIResult.create(HttpServletResponse.SC_OK, userSecName);
在后台,Liberty将进行一些进一步的身份验证并创建原则和主题。如果一切都配置正确并且用户有权进入应用程序,他将会并且将具有可用的原则和主题对象。