繁体   English   中英

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

[英]Limitations of using a PhaseListener instead of a Servlet Filter for authorization

我目前正在使用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");
    }
}

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

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

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

PhaseListener仅在JSF请求(即调用FacesServlet的HTTP请求)上触发。 执行非JSF请求时不会触发它,从而暴露非JSF请求的潜在安全漏洞。 无论目标servlet如何,都可以在每个HTTP请求上触发servlet Filter

换句话说:HTTP请求授权不应该与FacesContext可用,而是与可用的ServletRequest 始终尽量授权为“低级别”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM