3

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

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

我希望能够对脚手架控制器说“将此 URI 用作所有 URI 的前缀”并完成它,但是搜索文档和 Web 并没有证明很有帮助。

有任何想法吗?

4

1 回答 1

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")
  }
}

您可以在 URL 映射上使用任何常见的 Grails 约束类型,因此您可以通过白名单进行限制

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

或通过正则表达式

// exclude all controllers whose name starts "sec", e.g. secUser, secRole, ...
controller(matches:/(?!sec).*/)
于 2013-01-15T12:37:33.283 回答