intercept-url pattern / **导致404错误

时间:2013-03-01 11:59:49

标签: spring spring-security

我在这里搜索过谷歌和泉源,但找不到适合我的解决方案。我有以下spring-security.xml,当我使用模式

<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />

重定向到登录页面时,这会给我一个404错误。但如果我使用

,这不会发生

<intercept-url pattern="/index*" access="hasRole('ROLE_USER')" />

但显然这并不能保护应用程序的其余部分。

我确信这是一个简单的我可以忽略的但是我能找到的最接近的是this stack overflow question,我已经在下面的xml文件中加入了但仍然有同样的问题。我在没有use-expressions="true"的情况下尝试了这个,我尝试切换intercept-url周围(我不是100%,但我很确定/**模式应该是最后一个我相信网址的匹配顺序与宣布的相同)

任何建议/帮助都会很棒

弹簧security.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.0.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">

    <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/login" filters="none" access="permitAll" />
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        <form-login login-page="/login" default-target-url="/welcome"
            authentication-failure-url="/loginfailed" />
        <logout logout-success-url="/logout" />
    </http>

    <authentication-manager>
      <authentication-provider>
        <user-service>
            <user name="username" password="password" authorities="ROLE_USER" />
        </user-service>
      </authentication-provider>
    </authentication-manager>

</beans:beans>

更新

以防万一我正在使用Spring和Spring安全性3.0.4.RELEASE

答案

按照Kris的建议我改变了

<intercept-url pattern="/login" filters="none" access="permitAll" />

为:

<intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />

由于异常

导致500错误
    SpelEvaluationException: EL1008E:(pos 0): Field or property
     'IS_AUTHENTICATED_ANONYMOUSLY' cannot be found on object of 
type'org.springframework.security.web.access.expression.WebSecurityExpressionRoot

我通过将IS_AUTHENTICATED_ANONYMOUSLY更改为isAnonymous()

来解决了这个问题
<intercept-url pattern="/login" access="isAnonymous()" />

4 个答案:

答案 0 :(得分:9)

为了完整性,真正的原因需要更改为<http>

use-expressions元素的属性true默认为access=。在默认情况下,您需要使用&#34;安全表达式&#34;而不是角色名称。如果您只想在<http use-expressions="false"> ... </http> 声明中使用角色名称,则需要使用

关闭表达式
    var csrf_token = Alfresco.util.CSRFPolicy.getToken();
    var http = new XMLHttpRequest();
    var url = "hdp/ws/my-new-page";

    var params = "file={"+file.nodeRef+"}";
    http.open("POST", url, true);
    //Send the proper header information along with the request
    http.setRequestHeader("Alfresco-CSRFToken", csrf_token);
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http.setRequestHeader("Content-length", params.length);
    http.setRequestHeader("Connection", "close");

    http.onreadystatechange = function() {//Call a function when the state changes.
        if(http.readyState == 4 && http.status == 200) {
            alert(http.responseText);
        }
    }
    http.send(params);

答案 1 :(得分:8)

向堆栈添加AnonymousAuthenticationFilterAnonymousAuthenticationProvider。如果您使用IS_AUTHENTICATED_ANONYMOUSLY属性,则必需。 spring secuirty

或改为使用isAnonymous()

答案 2 :(得分:3)

更改此<intercept-url pattern="/login" filters="none" access="permitAll" />

<intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />

答案 3 :(得分:0)

配置看起来很好。可能是/login页面实际上不存在吗?第二个配置(使用/index*)可能只有效,因为您所做的请求没有被截获,因此没有被重新发送到不存在的/login页面。如果配置有问题,Spring Security会回复403而不是404。

如果/login网址有效,请在没有配置任何Spring Security的情况下仔细检查。