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

jon*_*nie 12 spring spring-security

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

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

这在重定向到登录页面时给出了404错误.但如果我使用,这不会发生

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

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

我确信这是一个简单的我忽略但我能找到的最接近的是这个堆栈溢出问题,我已经在下面的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>
Run Code Online (Sandbox Code Playgroud)

更新

以防它是我使用Spring和Spring安全性3.0.4.RELEASE的一个因素

回答

按照克里斯的建议我改变了

<intercept-url pattern="/login" filters="none" access="permitAll" />
Run Code Online (Sandbox Code Playgroud)

至:

<intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />
Run Code Online (Sandbox Code Playgroud)

由于异常,这导致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
Run Code Online (Sandbox Code Playgroud)

我通过改变IS_AUTHENTICATED_ANONYMOUSLY来解决这个问题isAnonymous()

<intercept-url pattern="/login" access="isAnonymous()" />
Run Code Online (Sandbox Code Playgroud)

Jim*_*son 9

为了完整起见,这是需要改变的真正原因isAnonymous().

<http>元素具有use-expressions默认属性true.在默认情况下,您需要使用"安全表达式"而不是角色名称.如果您只想在access=声明中使用角色名称,则需要使用关闭表达式

<http use-expressions="false"> ... </http>
Run Code Online (Sandbox Code Playgroud)


ous*_*dri 8

添加AnonymousAuthenticationFilter到堆栈和AnonymousAuthenticationProvider.如果您使用该IS_AUTHENTICATED_ANONYMOUSLY属性,则必需. 春天安全

或者isAnonymous()改为使用.


Kri*_*ris 3

改变这个<intercept-url pattern="/login" filters="none" access="permitAll" />

<intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" />
Run Code Online (Sandbox Code Playgroud)

  • 我将“IS_AUTHENTICATED_ANONYMOUSLY”更改为“isAnonymous()”并解决了这个问题 (9认同)