0

我们在公司使用访问管理器,访问管理器验证用户并在 http 标头中向我们发送有关用户的信息。在我的 JSF 应用程序中,我在会话开始时需要用户名,并使用此用户名从我的数据库中确定用户角色并在页面上隐藏一些组件。当我必须使用用户名信息和机制时。会话监听器,相位监听器?

至今;

我创建了一个 sessionScoped managedbean UserData,我尝试在 afterPhase 之后设置这个托管 bean phaseListener

@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. 使用此角色直到会话结束。
4

1 回答 1

1

只需添加一个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.

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

于 2013-09-09T00:17:02.510 回答