2

我添加行

<intercept-url pattern="/*" access="isAuthenticated()"/> 

到 security_config.xml 和浏览器说我

ERR_TOO_MANY_REDIRECTS

安全配置.xml

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <http use-expressions="true">
<!--        <intercept-url pattern="/*" access="permitAll" /> -->
        <intercept-url pattern="/*" access="isAuthenticated()"/> 
        <form-login login-page="/home.jsp"
            authentication-failure-url="/loginFailed" default-target-url="/index" />
        <logout logout-success-url="/logOut" />
    </http>
    <authentication-manager>
<!--        <authentication-provider ref="provider" /> -->
<authentication-provider>
    <user-service>
    <user name="name" authorities="ROLE_USER"/>
    </user-service>
</authentication-provider>
    </authentication-manager>

</beans:beans>

主页.jsp:

<%@ page language="java" contentType="text/html; charset=utf8"
    pageEncoding="utf8"%>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="sec"
    uri="http://www.springframework.org/security/tags"%>
<html>
<head>
<title>Home</title>
</head>
<body>
    <h1>
        Hello,
        <sec:authentication property="principal" />!
    </h1>
    <c:set var="username">
        <sec:authentication property="principal" />
    </c:set>
    <p style="color:#ff0000">${message}</p>

    <c:if test="${username != 'anonymousUser'}">
        <form method="POST" action="j_spring_security_logout">
            <input type="submit" value="log out">
        </form>
        <jsp:include page="WEB-INF/views/menu.jsp" flush="true" />
    </c:if>
    <form method="POST" action="<c:url value="/j_spring_security_check" />" <c:if test="${username != 'anonymousUser'}">hidden="true"</c:if>>
        <table>
            <tr>
                <td align="right">login</td>
                <td><input type="text" name="j_username" id="login"
                    onkeyup="validate()" /></td>
            </tr>
            <tr>
                <td align="right">password</td>
                <td><input type="password" name="j_password" id ="passwordId" onkeyup="validate()" /></td>
            </tr>
            <tr>
                <td align="right">remember me</td>
                <td><input type="checkbox" name="_spring_security_remember_me" /></td>
            </tr>
            <tr>
                <td colspan="2" align="right"><input type="submit"
                    value="Login" id="idSubmit" disabled /> <input type="reset"
                    value="Reset" /></td>
            </tr>
        </table>
    </form>

</body>
<script type="text/javascript">
    function validate() {
        element = document.getElementById("idSubmit");
        element1 = document.getElementById("login");
        resultMatch = element1.value.match('([a-zA-Z0-9])+(_){1}([a-zA-Z0-9])+')
        if (resultMatch == null){
            element.setAttribute("disabled", "disabled");
            return
        }
        if(resultMatch[0] == element1.value && document.getElementById("passwordId").value !="" ){
            element.removeAttribute("disabled");
            return
        }
        else
            element.setAttribute("disabled", "disabled");

    }
    window.onload = "validate()";
</script>
</html>

但如果我这样写

<intercept-url pattern="/*" access="permitAll" /> 

它运作良好。

你能帮助我吗?

4

2 回答 2

9
<intercept-url pattern="/*" access="isAuthenticated()"/>

表示所有URL 都需要身份验证。这包括您的登录 URL。发生的事情是您点击了一个 URL,spring 看到需要身份验证,因此它重定向到登录 URL,但是除非您经过身份验证,否则您无法访问登录 URL,因此它将您重定向到登录 URL - 因此是无限的重定向循环。

Spring 按照您定义它们的顺序评估拦截 URL,因此您可以通过在 catch all上方添加一行来解决它,告诉 spring登录 URL不需要auth 。您还应该为您在注销和登录失败后转发到的 URL 添加一行,否则它只会要求您再次登录。

<intercept-url pattern="/home.jsp" access="permitAll" /> 
<intercept-url pattern="/*" access="isAuthenticated()" /> 
于 2013-09-18T14:27:47.443 回答
1

当您具有以下配置时 ,注销阶段也可能发生同样的情况:http.logout().logoutSuccessUrl("/logout").permitAll();原因:Spring 安全第一次运行HttpSecuritygetHttp方法,它在其中初始化一个http对象。稍后,当您通过configure(HttpSecurity http)方法自定义此对象时,您实际上是在覆盖这些相同的字段。默认情况下,/logout用作注销 url,如果成功则重定向到注销成功 url。如图所示: spring security默认注销程序

但是,如果注销成功 url 配置为与 相同/logout,则无限重定向循环在那里等待。今天我打开了这个潘多拉魔盒。

于 2017-03-14T03:06:25.157 回答