Шаблон перехвата /url/ **, вызывающий ошибку 404

Я искал здесь, google и springsource для этого и не мог найти решение, которое сработало для меня. У меня есть ниже 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%, но я уверен, что шаблон /** должен быть последним, поскольку я считаю, что URL-адреса совпадают в одном и том же как указано)

Любые советы/помощь будут отличными

spring -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>

Update

На всякий случай это фактор, который я использую Spring и Spring security 3.0.4.RELEASE

Ответ

Следуя совету Криса, я изменил

<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()" />

Ответ 1

Измените это <intercept-url pattern="/login" filters="none" access="permitAll" />

to

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

Ответ 2

Для полноты здесь настоящая причина этого требует изменения на isAnonymous().

Элемент <http> имеет атрибут use-expressions, который по умолчанию равен true. В ситуации по умолчанию вам необходимо использовать "выражения безопасности" вместо имен ролей. Если вы хотите использовать только имена ролей в объявлениях access=, вам нужно отключить выражения с помощью

<http use-expressions="false"> ... </http>

Ответ 3

Добавляет AnonymousAuthenticationFilter в стек и AnonymousAuthenticationProvider. Требуется, если вы используете атрибут IS_AUTHENTICATED_ANONYMOUSLY. spring secuirty

или используйте isAnonymous().

Ответ 4

Конфигурация выглядит хорошо для меня. Может ли быть, что страница /login на самом деле не существует? Вторая конфигурация (с /index*) могла работать только потому, что тогда сделанный вами запрос не был перехвачен и, следовательно, не получил права на несуществующую страницу /login. Если это проблема с конфигурацией, Spring Security ответит 403 не 404.

Двойная проверка без каких-либо Spring Безопасность настроена, если работает URL-адрес /login.