【发布时间】:2015-06-23 12:48:44
【问题描述】:
我目前正在使用过滤器来检查 SSO 身份验证。 (如果请求标头包含变量“Proxy-Remote-User”,则认为 SSO 已通过身份验证)。
if (!(isSsoLoggedIn(request)) {
response.sendRedirect(ERROR_PAGE);
return;
} else {
chain.doFilter(req, res);
}
private boolean isSsoLoggedIn(HttpServletRequest request) {
return request != null && request.getHeader("Proxy-Remote-User") != null
&& !request.getHeader("Proxy-Remote-User").equals("");
}
现在,一旦用户通过身份验证,我想将该变量(它是一个电子邮件地址)传递给 JSF。我使用会话范围的 bean 来做到这一点:
@PostConstruct
public void init {
Map<String, String> requestHeaderMap = FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap();
String email = requestHeaderMap.get("Proxy-Remote-User");
user = getPersonFromDB(email);
}
这看起来很简单,但我不确定它是否是“正确”的方法。依靠 bean 的实例化来验证身份验证似乎是不正确的。
我刚刚想到的一个想法: 使用 CDI 会话范围的 bean 并将其 @Inject 到过滤器中。然后,您可以让过滤器本身检查有效用户,如果有效,则将其设置在会话范围的 bean 中,否则将其转发到错误页面。
这听起来像是一个有效的解决方案吗?
另一种方法可能是在呈现视图之前使用此处提到的视图参数让每个页面检查身份验证:
JSF calls methods when managed bean constructor sends 404 ERROR CODE
<f:metadata>
<f:viewAction action="#{bean.checkForValidUser}" />
</f:metadata>
对此我唯一的问题是......这需要将相同的代码复制/粘贴到每个看起来多余的页面(或至少一个模板供所有人使用)。
【问题讨论】:
-
你手头有 CDI 吗?
-
不幸的是,我正在使用 ManagedBeans,但我们的目标是将来转换为 CDI。我还没有研究过这个过程,但如果它很简单,我可能会转换为他们来让它工作。
-
如果我可以转换为 CDI,您是否建议我上面的 CDI 解决方案有效?
标签: jsf authentication jsf-2 filter single-sign-on