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

Jsf 使用PhaseListener而不是Servlet过滤器进行授权的局限性,jsf,jsf-2,authorization,servlet-filters,phaselistener,Jsf,Jsf 2,Authorization,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 = ch

我目前正在使用如下所示的
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");
    }
}
它符合我的要求,但是我没有看到它被列在中,并且还提到以下内容:

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


我不完全理解在执行用户授权时使用
PhaseListener
而不是
Filter
的局限性。有人能给我解释一下吗?

一个
PhaseListener
只在JSF请求(即调用
FacesServlet
的HTTP请求)时启动。它不会在执行非JSF请求时触发,因此会在非JSF请求上暴露潜在的安全漏洞。servlet
过滤器可以在每个HTTP请求上触发,而不管目标servlet是什么


换句话说:HTTP请求授权不应该与
FacesContext
可用绑定,而应该与
ServletRequest
可用绑定。始终尝试授权尽可能的“低级别”。

如果您否决了投票。你能补充一下为什么你认为这是一个糟糕的问题吗?一般来说,征求意见的问题(“为什么我应该”)而不是关于具体的技术问题,被认为是关于堆栈溢出的离题问题,因此可能会被否决。即使这是一个可以接受的问题,你最好添加链接来支持那些“模糊的理由”,而不是通过根本不引用链接来使它们更加模糊。哦,这不是Java SE的问题,所以
[Java]
标记也是一个错误的选择,当看到这个带有代码的JSF特定问题时,只会吸引那些认为“他在谈论wtf?”的人,而这些问题对他们来说毫无意义。@BalusC据我所知,你是stack的资深用户。同时也是JSF的荣誉人物。你能把我的问题修改到可以接受的程度吗?我把问题主体化了,贴出了答案。