我想知道是否可以为特定包中的所有控制器重写 URL。我需要将“admin”包中所有控制器的 URL 更改为“/admin/$controller”而不是“/$controller”,因此它可以由 Spring Security 保护。非常感谢。
问候,洛伊扎
我想知道是否可以为特定包中的所有控制器重写 URL。我需要将“admin”包中所有控制器的 URL 更改为“/admin/$controller”而不是“/$controller”,因此它可以由 Spring Security 保护。非常感谢。
问候,洛伊扎
所以今天我根据这篇文章实现了解决方案:
// 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
}
}
}
}
这不是绝对必要的。您可以将 @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")
但是在这种情况下,我总是建议将您的管理区域拆分为一个单独的 grails-embedded-plugin。在这里,您可以使用自定义类来发挥您的魔力UrlMapping
。这将使您的主应用程序保持清洁。