Spring安全重复重定向

时间:2014-01-08 22:58:58

标签: spring spring-security

我在我的应用程序中使用spring security。我希望用户在访问服务器上的任何页面之前先登录,因此我采用重定向方法。但重定向似乎是无限循环,因为无论我提交页面多少次,它都会将我重定向到登录页面。我试过调试,请求总是按照我的预期点击GET而不是POST方法。我正在使用LDAP身份验证使用用户在表单上输入的详细信息。这是安全上下文xml中的代码。有人能指出我正确的方向。

<http pattern="/resources/**" security="none" />

<http auto-config="true">
    <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login login-page="/login" default-target-url="/dashboard"
        authentication-failure-url="/loginfailed" />
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
            <user name="bob" password="bobspassword" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

当我删除 的 <form-login login-page="/login" default-target-url="/dashboard" authentication-failure-url="/loginfailed" /> 它默认为spring登录页面并且它可以工作,但我必须使用配置xml中的用户凭据而不是LDAP凭据。

编辑**

   <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
 <link rel="stylesheet" href="${contextPath}/resources/css/styles.css" type="text/css">
 <h2 style="text-align:center">Login to continue to Application</h2>
<div align="center" class="div">
    <form:form method="POST" modelAttribute="login" action="authenticate">
        <table>
            <tr>
                <td><form:label path="username" class="label">Username:</form:label></td>
                <td><form:input path="username" class="input"/></td>
                <td><form:errors path="username" class="error" /></td>
            </tr>
            <tr>
                <td><form:label path="password" class="label">Password:</form:label></td>
                <td><form:password path="password" class="input"/></td>
                <td><form:errors path="password" class="error"/></td>               
            </tr>
            <tr>
                <td colspan="2" align="right"><input type="submit"
                    value="Login" class="button"/></td>
            </tr>
        </table>
    </form:form>
</div>

感谢 SREE

2 个答案:

答案 0 :(得分:0)

@sri

如您的代码中所述,我可以看到您拦截了网址"/login*"

现在任何登录结尾的网址都会被春季安全网拦截,之后你必须输入正确的凭据....

现在提供凭据后,您将被重定向到页面/login

现在很明显,我们的网址再次以登录结束,因此它被春季安全再次拦截...... 这就是为什么循环继续....

可能的解决方案

这可能适合你, 只需将以下代码放在<http pattern="/resources/**" security="none" />标记下方,如下所示:

代码:

<http pattern="/resources/**" security="none" />
<http pattern="/Login.html" security="none" />

答案 1 :(得分:0)

确定。最后我进入了一个工作状态。以下是我对安全上下文xml

所做的更改
        <intercept-url pattern="/login/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

url正则表达式更改。此外,我的login.jsp中的操作现在是

action="/login/authenticate"

最后更新控制器请求映射路径。 希望这可以帮助任何有类似问题的人。我还没有发现这是否是实现它的正确方法,但现在仍有效。

-Sree