JSF 登录控件,与访问管理器集成



我们在公司中使用访问管理器,访问管理器对用户进行身份验证,并在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 的用户名。

我试图实现这一目标。

  1. 当请求来时从标头读取并获取用户名。
  2. 使用此用户名询问数据库并获取用户的角色。
  3. 将此角色存储在 SessionScoped ManagedBean 中。
  4. 使用此角色直到会话结束。

只需添加一个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 的证明。

顺便说一下,除非您使用限制性(内部网)代理,否则您是否很清楚最终用户可以完全控制他/她可以通过请求标头发送的内容?

最新更新