Spring Security 3.0表单登录转发到外部资源

时间:2010-11-08 23:31:08

标签: spring-security

form-login标记是否可以使用外部资源的网址?

我有两个在不同的应用程序上下文中运行的Web服务[案例#1]。它们也可以在不同的机器上[案例#2]。

我希望第一个服务使用Spring Security来强制执行某些方法的身份验证。我希望第二个服务用作身份验证机制。如果请求在尝试在第一个服务上调用受保护方法时未经过身份验证,则应将请求转发到第二个服务进行身份验证。

两项服务均已启动并正在运行。我已经配置了第一个服务并且“正在工作”,除了URL,它将请求转发到用户尚未通过身份验证时。

如果第一个Web服务位于http://server1/community,Spring Security是否可以将用户转发到在单独的上下文中运行的其他服务?

例如:

<security:form-login 
    login-page="/auth/login.jsp" />

其中/auth是第二个服务的上下文。

或者,它可以一起转发到另一台服务器吗?

<security:form-login 
    login-page="http://server2/auth/login.jsp" />

当我尝试上面的第一个配置时,转发的网址变为http://server1/community/auth/login.jsp。我想要http://server1/auth/login.jsp

第二种配置产生了http://server1/communityhttp://server2/auth/login.jsp

显然,URL被认为是相对于当前上下文的。有没有办法改变这种行为?或者,有没有更好的方法来做我想做的事情,我只是没有偶然发现它? ^ __ ^

感谢您的帮助!

- JS

PS:我之前发布的这篇文章是对前一篇文章的“回答”。遗憾。

2 个答案:

答案 0 :(得分:1)

我想你可以覆盖LoginUrlAuthenticationEntryPoint类,而不是使用标签,你手动将所需元素添加到配置

有关所需元素,请参阅form-login doku。 它只有UsernamePasswordAuthenticationFilter和LoginUrlAuthenticationEntryPoint。 我想你可以使用自定义过滤器标签来添加过滤器。

答案 1 :(得分:1)

是的,有办法做你想做的事。您需要的关键字是login-processing-url元素上的form-login

示例:

<form-login login-page="/auth/login" login-processing-url="/auth/example_security_check"/>

然后在你的jsp页面中,你想把动作设置为你放在那里的任何东西:

<form action="example_security_check" method="post">
    <label for="j_username">Login</label>:
    <input id="j_username" name="j_username" size="20" maxlength="50" type="text"/>
    <br/>

    <label for="j_password">Password</label>:
    <input id="j_password" name="j_password" size="20" maxlength="50" type="password"/>
    <br/>

    <input type="submit" value="Login"/>
    <br/>
    <br/>

    <input id="_spring_security_remember_me" name="_spring_security_remember_me" type="checkbox" value="true"/>
    <label for="_spring_security_remember_me">Remember Me?</label>
</form>

该属性的文档在这里

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/appendix-namespace.html