我已经在这里、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 的匹配顺序与声明的顺序相同)
任何建议/帮助都会很棒
弹簧安全.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 security 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()" />