我们在公司中使用访问管理器,访问管理器对用户进行身份验证,并在http标头中向我们发送有关用户的信息。在我的 JSF 应用程序中,会话开始时我需要用户名,使用此用户名,我可以从数据库中确定用户角色,并在页面上隐藏了一些组件。当我必须用户名信息和哪个与机制。SessionListener, PhaseListener?
迄今;
我创建了一个 sessionScoped managedbean UserData,并尝试设置这个托管 bean phaseListener afterPhase
@Override
public void beforePhase(PhaseEvent event) {
}
@Override
public void afterPhase(PhaseEvent event) {
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();
accessManagerUser.setUserName((String) request
.getHeader("LOGINNAME"));*/
}
但是在这种情况下,当一个请求完成到页面时,这个函数运行,ı 希望一个函数运行一次,在所有之前,并设置 SessionScopeManaged Bean 的用户名。
我试图实现这一目标。
- 当请求来时从标头读取并获取用户名。
- 使用此用户名询问数据库并获取用户的角色。
- 将此角色存储在 SessionScoped ManagedBean 中。
- 使用此角色直到会话结束。
只需添加一个if
检查,检查角色是否已存储在会话中。
if (roles are not stored in session) {
read from header;
get user+roles from database;
store roles in session;
}
与具体问题无关,阶段侦听器是 HTTP 请求身份验证作业的错误工具。考虑使用 servlet 过滤器。在其中,您可以只访问HTTP请求和会话,而无需从JSF API的深处扩展它们。请注意,会话范围的 JSF 管理的 Bean 基本上存储为 HttpSession
的证明。
顺便说一下,除非您使用限制性(内部网)代理,否则您是否很清楚最终用户可以完全控制他/她可以通过请求标头发送的内容?