【发布时间】:2018-10-31 20:18:24
【问题描述】:
我在 PrimeFaces 应用程序中使用容器安全性(J2EE 安全性),但我无法获得最初请求的 URL。用户通过身份验证后,我想将他们引导回原来的请求。我在任何地方都找不到那个原始请求。
J2EE 安全提供程序在 Weblogic 中配置,表单身份验证在 Web XML 中,如下所示:
<login-config>
<auth-method>FORM</auth-method>
<realm-name>myrealm</realm-name>
<form-login-config>
<form-login-page>/faces/login.xhtml</form-login-page>
<form-error-page>/faces/unauthorized.xhtml</form-error-page>
</form-login-config>
</login-config>
在登录表单中,我在 bean 中进行身份验证。想象一个简单的形式:
<h:form>
<p:inputText id="userName" value="#{userManager.userName}" />
<p:password id="password" value="#{userManager.password}"/>
<p:commandButton action="#{userManager.login()}" value="Login"/>
</h:form>
Login Bean 看起来像这样:
@Named
@SessionScoped
public class UserManager implements Serializable {
private String userName;
private String password;
private String requestedURL;
@Inject
private HttpServletRequest request;
@PostConstruct
public void init() {
requestedURL = request.getHeader("Referer"); //this is null
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
String forwardRequestURI = (String)externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI);
}
public void login() {
request.login(getUserName(), getPassword());
//if successful, redirect back to place they came from
}
}
request.getHeader("Referer") 和 RequestDispatcher.FORWARD_REQUEST_URI 都为空。我在这里需要什么魔法?
【问题讨论】:
-
不要构建自己的安全/身份验证框架。使用现有的。 Shiro,Picketlink,随便什么。他们都有这个内置。也许它们是空的……您是否通过断点检查了请求?如果它们为空,JSF 无法帮助,servlet 容器应该这样做。但是请参阅我在评论开头的评论
-
@Kukeltje,你不记得曾经帮助我处理 Shiro 吗?这是一团糟。容器安全正是我所需要的。它与 AD 集成,甚至可以跨领域进行单点登录。我们甚至有支持。另外,我相信他们会继续改进它。所以...我怎样才能得到那个 URL?一定是个把戏。
-
对不起,我没有。我(尝试)每周帮助几十个人。但请阅读我的其余评论。容器应该提供它。如果没有,JSF 就无法访问它。并且可能检查它是否存在于登录页面的渲染中(通过调试 prerender bean 中的请求)。如果是这样,请将其存放在某个地方以供使用。如果它在重定向到登录页面时丢失,请归咎于规范或向容器提交错误(如果规范说应该保留它)。就目前而言,JSF 不应该受到责备。
标签: jsf