【问题标题】:Get original url from J2EE Security Forward从 J2EE Security Forward 获取原始 url
【发布时间】: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


【解决方案1】:

对于 Weblogic,使用:

String targetUrl = (String) session.getAttribute("weblogic.formauth.targeturl");

【讨论】:

  • 我怀疑 JavaEE 安全标准的意图是要求 weblogic 特定代码。如果您查看ibm.com/developerworks/library/j-javaee8-security-api-2/…,您会看到一个 JSF 示例。可能是您以错误的方式返回“重定向”,而容器应该为您执行此操作(这将是更合乎逻辑的方式)
  • 那篇文章是 EE 8,我们还没有。根据我的阅读,使用 EE 8 一切都变得简单了一些。我们选择它的另一个原因。
  • 那么您确定您使用的是 javaee 安全性(EE7?)或一些特定于 weblogic 的东西吗?
  • 我们刚刚开始使用 EE 安全,它是在 EE7
猜你喜欢
  • 2018-02-09
  • 2015-03-23
  • 1970-01-01
  • 2010-10-21
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多