1

我想知道是否可以为特定包中的所有控制器重写 URL。我需要将“admin”包中所有控制器的 URL 更改为“/admin/$controller”而不是“/$controller”,因此它可以由 Spring Security 保护。非常感谢。

问候,洛伊扎

4

3 回答 3

3

所以今天我根据这篇文章实现了解决方案:

// AppCtx - check the article above
for (controller in AppCtx.grailsApplication.controllerClasses) {
    def cName = controller.logicalPropertyName
    def packageName = controller.packageName

    if (packageName.contains(".admin") || packageName.contains(".springsecurity")) {
        "/admin/${cName}/$action?/$id?"(controller: cName) {
            constraints {
            }
        }
    } else {
        "/${cName}/$action?/$id?"(controller: cName) {
            constraints {
                // apply constraints here
            }
        }
    }
}
于 2012-05-27T10:54:54.540 回答
0

这不是绝对必要的。您可以将 @Secured 注释添加到每个管理控制器:

@Secured(['ROLE_ADMIN'])
class AdminController1 { ... }

@Secured(['ROLE_ADMIN'])
class AdminController2 { ... }

或者,如果您不使用注释,则可以将每个管理控制器直接映射到 Spring Security 配置:

/adminController1/**=ROLE_ADMIN
/adminController2/**=ROLE_ADMIN

但是,如果您真的想将所有这些控制器放在 /admin/ URL 前缀下,我认为您可以通过添加手动引用每个管理控制器的映射来做到这一点:

"/admin/adminController1/$action?/$id?"(controller: "adminController1")
"/admin/adminController2/$action?/$id?"(controller: "adminController2")
于 2012-04-12T23:17:49.640 回答
0

看看:在 Grails 中创建管理部分的最佳方法

但是在这种情况下,我总是建议将您的管理区域拆分为一个单独的 grails-embedded-plugin。在这里,您可以使用自定义类来发挥您的魔力UrlMapping。这将使您的主应用程序保持清洁。

于 2012-04-12T23:31:09.033 回答