【问题标题】:Does Grails Filter `actionExclude` work with method-based routing?Grails 过滤器“actionExclude”是否适用于基于方法的路由?
【发布时间】:2013-09-16 21:00:30
【问题描述】:

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

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,而不是“欢迎”。不确定这是否与问题有关。

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

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

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

谢谢!

【问题讨论】:

    标签: grails routing url-mapping grails-filters


    【解决方案1】:

    您需要使用如下过滤器:

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

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

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

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

    【讨论】:

    • 这对我不起作用(即使是 welcome 操作也会调用闭包)。它对你有用吗?
    • 那是我的运气。什么 grails 版本?
    • @Bosh Grails 2.2.4。我现在没有示例代码,但我可以在晚上回家后将其转发给您。现在,您可以创建一个示例应用并对其进行测试。
    • 谢谢——我将使用 Grails 2.2.4 创建一个干净的示例应用程序并报告结果!
    • 不走运:我刚刚使用您在上面提供的确切语法使用 Grails 2.2.4 创建了一个干净的示例应用程序,其中一个控制器 + 一个过滤器。甚至对于 welcome 操作也会调用闭包,使用我在初始帖子中描述的 UrlMappings
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 2021-10-03
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多