使用Spring Security避免在Grails App中登录重定向

时间:2014-01-21 14:45:50

标签: spring grails spring-security

我有一个Grails应用程序,它使用Spring Security Core进行身份验证和授权。该应用程序的主要目的是提供一个rest api,该api使用通过每个请求中的Authorization标头传入的令牌进行保护。此令牌是在grails应用程序之外生成的,并且没有正式的“登录”阶段 - 每个请求都经过身份验证和单独授权。

我已经实现了我自己的身份验证过滤器和提供程序,这似乎与令牌身份验证相同。问题是,对于成功的身份验证,当我只想静默地继续原始请求时,spring安全核心总是重定向到登录成功页面(通过successHandler.defaultTargetUrl配置):

  1. 用户请求/ rest / foo
  2. 自定义弹簧安全过滤器匹配请求并处理它。如果授权头是好的,则调用/ rest / foo(当前重定向到defaultTargetUrl),否则将用户转发到/ error。 (这最后一部分有效)
  3. 查看AjaxAwareAuthenticationSuccessHandler的源代码,这似乎是罪魁祸首,我看到我可以通过添加targetUrlParameter(默认为'spring-security-redirect)作为请求参数来设置targetUrl,但这似乎既丑陋又不必要。有没有办法让这项工作符合要求?我考虑过实现自己的SuccessHandler ......这是正确的解决方案吗?我还有其他选择吗?

    编辑: 我通过扩展AjaxAwareAuthenticationSuccessHandler并覆盖determineTargetUrl(请求,响应)并返回request.getServletPath()来尝试自定义成功处理程序。这让我超越了最初的问题,但创建了一个无限的重定向循环,可能是由于我需要无状态身份验证和DefaultRedirectStrategy重定向到目的地而不是转发。

    编辑#2:成功!使用this SOF thread中的代码我能够使用自定义AuthenticationSuccessHandler解决方案。对于Grails用户,您还需要更新resources.groovy,如下所示:

    authenticationSuccessHandler(com.foo.bar.YourSuccessHandler){}
    

1 个答案:

答案 0 :(得分:2)

您是否检查了基于Spring Security Core的Spring Security for Rest

修改

如果您想更改默认操作,可以在config.groovy中更改targetUrlParameter的值。