我有一个RESTful Grails(2.2.1)网络应用程序,其中Spring-Security插件(1.2.7.3)在所有控制器上为BasicAuth配置(它是一个"服务应用程序"具有JSON有效负载和没有HTML输出)。当身份验证失败(用户ID /密码/帐户被锁定)时,响应正文是一个丑陋的Tomcat HTML格式的字符串。我更愿意生成自己的(JSON)响应,但在将它移交给Tomcat之前似乎无法拦截异常。
我尝试过配置adh.errorPage
和failureHandle.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
(??),事情似乎有效!
答案 0 :(得分:0)
在不知道返回的内容的情况下,我只能假设将403(禁止)返回给您的客户端。在这种情况下,您始终可以将响应代码映射到您自己的控制器以返回正确的JSON消息。例如
class UrlMappings {
static mappings {
"403" (controller: "error", action: "forbidden")
"404" (controller: "error", action: "notFound")
"500" (controller: "error", action: "internalError")
}
}
有关映射,响应代码等的更多信息,请参阅documentation for URL Mappings。