Grails Filter`actionExclude`是否适用于基于方法的路由?

时间:2013-09-16 21:00:30

标签: grails routing url-mapping grails-filters

我有一个基于方法的路线,如:

name base: "/" {
  controller="api"
  action=[GET: "welcome", POST: "post"]
}

我想应用过滤器来处理授权,例如

class RequestFilters {
    def filters = {
        authorizeRequest(controller: 'api', actionExclude: 'welcome') {
            before = {
                log.debug("Applying authorization filter.")
            }           
        }
    }
}

但是当我在实践中应用它时,过滤器会在所有请求上运行(即使GET请求也应该使用welcome方法,因此不应该触发此过滤器。)

当我检查在过滤器中运行的代码时,我看到params.action被设置为路由文件中的Map,而不是“welcome”。不确定这是否与问题有关。

我当前的解决方法(感觉非常错误)是将以下内容添加到我的过滤器的正文中:

if(params.action[request.method] == 'welcome'){
    return true
}

简短的问题是:Grails是否支持基于方法的路由+基于动作名称的过滤的组合?如果是这样,怎么样?如果没有,那么重组这种逻辑有哪些合理的替代方案?

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要使用以下过滤器:

class RequestFilters {
    def filters = {
        authorizeRequest(controller:'api', action:'*', actionExclude:'welcome'){
            before = {
                log.debug("Applying authorization filter.")
                return true
            }           
        }
    }
}

将过滤器应用于控制器all“welcome”的but个操作。 :)

如果其他控制器中没有其他welcome操作,那么您也不需要过滤器中指定的控制器。

authorizeRequest(action:'*', actionExclude:'welcome'){...}