我正在使用grails-spring-security-rest插件来保护我的休息api。
我无法使用插件通过AJAX成功调用其余的api。我收到302响应,导致重定向循环。
$.ajax({
url: "http://localhost:8084/app/api/controller",
type: "GET",
beforeSend: function(xhr){xhr.setRequestHeader('Authorization', 'Bearer <TOKEN>');},
});
我测试过非经过身份验证,删除了插件,一切正常。
我能用curl成功调用其余的api:
curl -i -H "Accept: application/json" -H "Authorization:Bearer <TOKEN>" http://localhost:8084/app/api/controller
我有以下配置:
BuildConfig.groovy
compile ':spring-security-core:2.0-RC3'
compile ":spring-security-rest:1.4.0.RC5", {
excludes: 'spring-security-core'
}
Config.groovy中
grails.plugin.springsecurity.rest.login.useJsonCredentials = true
grails.plugin.springsecurity.rest.token.storage.useGorm = true
grails.plugin.springsecurity.rest.token.storage.gorm.tokenDomainClassName = 'com.app.security.AuthenticationToken'
grails.plugin.springsecurity.filterChain.chainMap = [
'/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter', // Stateless chain
'/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter' // Traditional chain
]
我已确保在标头中发送了正确的身份验证令牌,以下是请求中的代码段:
Request URL:http://localhost:8084/app/api/controller/
Accept:application/json, text/plain, */*
Authorization:Bearer <TOKEN>
在我的提交中查找我是否做错了,或者这可能是插件中的错误?
谢谢。
答案 0 :(得分:2)
你必须删除记住我的过滤器。
像这样使用:
'/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter'
这个''bug'只会在你之前使用过具有常规弹簧安全性的应用程序时发生,因为那时你会有一个cookie会劫持整个过滤器进程并尝试登录你(并重定向你),在自定义rest插件过滤器和原始spring安全性之间进行重定向战争。