使用PhaseListener而不是Servlet过滤器进行授权的限制

Mil*_*aid 3 jsf authorization jsf-2 servlet-filters phaselistener

我目前正在使用PhaseListener如下方法来执行用户授权.

private PhaseId phaseId = PhaseId.RESTORE_VIEW;

@Override
public void afterPhase(PhaseEvent event) {

    FacesContext fc = event.getFacesContext();
    boolean isOnAllowedPage = false;
    String[] allowedPages = choseRightPages(); // chose pages for role

    for (String s : allowedPages) {
        if (fc.getViewRoot().getViewId().lastIndexOf(s) > -1) {
            isOnAllowedPage = true;
            break;
        }
    }

    if (!isOnAllowedPage) {
        NavigationHandler nh = fc.getApplication().getNavigationHandler();
        nh.handleNavigation(fc, null, "prohibited");
    }
}
Run Code Online (Sandbox Code Playgroud)

它做我想要的,但我没有看到它列在如何处理数据库中的用户的身份验证/授权?这个名为"使用phaselistener问题的授权"的Coderanch主题也提到了以下内容:

您不应该将与JSF紧密相关的授权结合在一起.更好地利用容器管理的身份验证和/或作用于覆盖受保护页面的url模式的简单过滤器.

我并不完全理解在执行用户授权时使用a PhaseListener而不是a 的限制Filter.有人可以向我解释一下吗?

Bal*_*usC 6

A PhaseListener仅在JSF请求(即调用它的HTTP请求FacesServlet)上触发.执行非JSF请求时不会触发它,从而暴露非JSF请求的潜在安全漏洞.一个servlet Filter可以在每个单独的HTTP请求被触发,而不考虑目标的servlet.

换句话说:HTTP请求授权不应该与FacesContext可用资源相关联,而应该与ServletRequest可用资源相关联.始终尽量授权为"低级别".


归档时间:

查看次数:

1057 次

最近记录:

11 年,1 月 前