完全覆盖Grails脚手架URL或使用前缀

时间:2013-01-15 12:12:58

标签: grails scaffolding

我有一个定义了static scaffold = true的控制器,以及一些自定义操作。

我想确保只有登录用户和ADMIN类型(我们域中的某些Enum值)才能访问它。为了实现这一点,我实现了一个映射到/admin/** URI空间的grails过滤器,当然还有当脚手架不在那里时有问题的域/控制器的URI。我为show / edit / create操作添加了自定义的,命名的URL映射(直接工作并直接委托给scaffold层),但我最终得到了两个专门用于此目的的URI上下文。

我希望能够对脚手架控制器说“使用此URI作为所有URI的前缀”并完成它,但一般来说搜索文档和网络并没有证明非常有帮助。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

脚手架控制器使用标准taglib调用生成所有URL,这些调用对URL映射很敏感。因此,如果你有正确的URL映射,那么它应该工作。如果您希望在MyDomainController下映射/admin,则需要类似

的内容
class UrlMappings {
  static mappings = {
    "/$controller/$action?/$id?" {
      constraints {
        controller(validator:{
          // make sure this mapping doesn't apply to the MyDomainController,
          // so it will only be accessible via the protected /admin URL
          return it != "myDomain"
        })
      }
    }

    // special rule for the MyDomainController
    "/admin/myDomain/$action?/$id?"(controller:"myDomain")
  }
}

您可以在网址映射中使用any of the usual Grails constraint types,因此您可以按白名单限制

controller(inList:['foo', 'bar'])

或通过正则表达式

// exclude all controllers whose name starts "sec", e.g. secUser, secRole, ...
controller(matches:/(?!sec).*/)