Grails - Spring Security REST - 302 响应网络::ERR_TOO_MANY_REDIRECTS

Posted

技术标签:

【中文标题】Grails - Spring Security REST - 302 响应网络::ERR_TOO_MANY_REDIRECTS【英文标题】:Grails - Spring Security REST - 302 Response net::ERR_TOO_MANY_REDIRECTS 【发布时间】:2014-09-17 14:07:21 【问题描述】:

我正在使用grails-spring-security-rest 插件来保护我的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
]

我已确保在标头中发送了正确的身份验证令牌,这是来自请求的 sn-p:

Request URL:http://localhost:8084/app/api/controller/
Accept:application/json, text/plain, */*
Authorization:Bearer <TOKEN>

寻找我在提交时是否做错了什么,或者这可能是插件中的错误?

谢谢。

【问题讨论】:

我有同样的错误,cweston 你有没有找到任何地方? @OliverTynes 我没有时间继续调查这个问题,所以我决定暂时不使用该插件。不过,我确实创建了一张票 here,如果您想跟进。 @OliverTynes 如果您能解决问题,请告诉我。 查看我的答案。在其他新闻中,我刚刚从头开始制作了自己的 auth 插件,它只使用原始的 @Secured 注释。我将尝试在 11 月初发布,它旨在成为 Spring 安全性的 REST 插件替代品。您基本上只需要搜索和替换 spring 安全注释导入以替换我的注释 + 更改 springSecurityService.ifAnyGranted() 以使用 restSecurityService.ifAnyGranted() 等。如果您是,您可以注入您自己的 userdetail 验证器和密码编码器不使用 bcrypt(我的插件中的标准)。 @OliverTynes 你的插件叫什么名字?可以发一下链接吗? 【参考方案1】:

您必须删除记住我的过滤器。

这样使用: '/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter'

这个..“错误”只有在您之前使用过常规 Spring Security 的应用程序时才会发生,因为这样您将拥有一个 cookie,它会劫持整个过滤过程并尝试让您登录(并重定向您),在自定义的 rest 插件过滤器和原始的 spring 安全之间进行重定向战争。

【讨论】:

以上是关于Grails - Spring Security REST - 302 响应网络::ERR_TOO_MANY_REDIRECTS的主要内容,如果未能解决你的问题,请参考以下文章

grails-spring-security-rest 插件和悲观锁定

Grails + spring-security-core:用户登录后如何分配角色?

Grails Spring Security注释问题

Grails spring-security-oauth-google:如何设置

Grails Spring Security 插件网址

Grails/Spring Security:无法使用新创建的用户登录