[英]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.