我在这里搜索过谷歌和泉源,但找不到适合我的解决方案。我有以下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()" />
答案 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)
向堆栈添加AnonymousAuthenticationFilter
和AnonymousAuthenticationProvider
。如果您使用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的情况下仔细检查。