如何捕获Grails Spring-Security BasicAuth失败?

时间:2014-03-17 15:25:48

标签: grails spring-security basic-authentication

我有一个RESTful Grails(2.2.1)网络应用程序,其中Spring-Security插件(1.2.7.3)在所有控制器上为BasicAuth配置(它是一个"服务应用程序"具有JSON有效负载和没有HTML输出)。当身份验证失败(用户ID /密码/帐户被锁定)时,响应正文是一个丑陋的Tomcat HTML格式的字符串。我更愿意生成自己的(JSON)响应,但在将它移交给Tomcat之前似乎无法拦截异常。

我尝试过配置adh.errorPagefailureHandle.defaultFailureUrl,但似乎永远不会调用这些控制器/操作。

我需要配置什么才能执行此操作?

修改:来自Config.groovy的其他一些设置:

...filterChain.chainMap = [
    '/error/**': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter',
    '/**': 'JOINED_FILTERS,-exceptionTranslationFilter' ]
...adh.errorPage = '/error/denied'
...controllerAnnotations.staticRules = [ '/error/**': ['permitAll'] ]
...failureHandler.defaultFailureUrl = '/error/authfail'

当然,我有ErrorController.groovy定义了上述方法。

另外:我定义了一个ApplicationListener来计算失败的登录次数,我注意到它被调用了两次以进行单个REST调用 - 重定向到错误控制器是否也会失败?

Edit2:我的假设是正确的:" / grails-errorhandler"在最初的失败后失败了。我不知道这是否是正确的方法,但现在我有:

...filterChain.chainMap = [
                '/<each controller listed separately>/**': 'JOINED_FILTERS,-exceptionTranslationFilter']
]

并且似乎不需要任何controllerAnnotations.staticRules(??),事情似乎有效!

1 个答案:

答案 0 :(得分:0)

在不知道返回的内容的情况下,我只能假设将403(禁止)返回给您的客户端。在这种情况下,您始终可以将响应代码映射到您自己的控制器以返回正确的JSON消息。例如

的grails-app / CONF / UrlMappings.groovy

class UrlMappings {
  static mappings {
    "403" (controller: "error", action: "forbidden")
    "404" (controller: "error", action: "notFound")
    "500" (controller: "error", action: "internalError")
  }
}

有关映射,响应代码等的更多信息,请参阅documentation for URL Mappings