0

下面的链接是一个安全的URL,我需要在登录后保留“resource”参数,因为它是用来在成功登录后重定向用户的。

http://wwwtest.mycompany.com/mwa/ssologin?resource=/content/en/home.html

web.xml

    <security-constraint>
    <web-resource-collection>
        <web-resource-name>Secured</web-resource-name>
        <description></description>
        <url-pattern>/home</url-pattern>
        <url-pattern>/jsp/apps/*</url-pattern>
        <url-pattern>/ssologin</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>

    <auth-constraint>
        <description>protectedlinks</description>
        <role-name>protected</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>mycompany.com</realm-name>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
</login-config>

<security-role>
    <description>
    Protected portion of site</description>
    <role-name>protected</role-name>
</security-role>

login.jsp - 用户似乎被重定向到 login.jsp 并且请求属性(包括“资源”URL 参数)不再存在

<form name="loginForm" method="post" action="login?resource=<c:out value='${param.resource}'/>">
Username: 
<br/>
<input type="text" size="15" name="user">
<br/>
Password: 
<br/>
<input type="password" size="15" name="password">
<br/>
<input type="Submit" value="Login">

当我尝试通过 TagLib 或过滤器访问请求时,Web 容器 (WebSphere) 似乎正在执行重定向我的 login.jsp。由于重定向, ${param.resource} 也不起作用。

最简单的解决方案是让浏览器执行转发而不是重定向,但到目前为止,我找不到在安全约束(或其他任何地方)中强制执行转发的方法。我想到了其他一些令人费解的会话流程,但我都不喜欢它们。

唯一可以接受的解决方案是包含一些 JavaScript 来更新操作以包含 URL 参数,但这并不总是有效,因为有些浏览器会保留原始 URL,有些会更新为重定向 URL (wwwtest.mycompany. com/mwa/login.jsp)。

为了安全起见,我如何强制转发而不是重定向请求,或者以完全不同的方式解决这个问题?

更新

  • 资源参数是动态的,由第 3 方设置
  • 如果我删除 url-pattern "/ssologin",我的 JSTL/EL 语法绝对可以正常工作
  • 隐藏参数将不起作用,因为“资源”参数不再在请求中

谢谢,肖恩

4

1 回答 1

0

在您的表单中选择一个隐藏字段(登录),然后

<input type="hidden" name="someParam" value="${param.resource}"/>

您将在下一个表单 POST 中收到此信息(提交 loginForm 后)

同样正如 BalusC 所提到的,您需要通过以下方式转义 XML

<input type="hidden" name="resource" value="${fn:escapeXml(param.resource)}"/> 
于 2012-06-19T22:03:45.743 回答