Grails—为包中的所有控制器重写URL

Grails—为包中的所有控制器重写URL,grails,url-rewriting,Grails,Url Rewriting,我想知道是否有可能重写特定包中所有控制器的URL。我需要将“admin”包中所有控制器的URL改为“/admin/$controller”,而不是“/$controller”,这样它就可以由Spring Security保护。非常感谢 问候,, Lojza这并不是绝对必要的。您可以将@Secured注释添加到每个管理控制器: @Secured(['ROLE_ADMIN']) class AdminController1 { ... } @Secured(['ROLE_ADMIN']) clas

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

问候,,
Lojza

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

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

@Secured(['ROLE_ADMIN'])
class AdminController2 { ... }
或者,如果不使用注释,可以将每个管理控制器直接映射到Spring安全配置:

/adminController1/**=ROLE_ADMIN
/adminController2/**=ROLE_ADMIN
但如果您真的想将所有这些控制器置于/admin/URL前缀下,我认为您可以通过添加手动引用每个管理控制器的映射来实现:

"/admin/adminController1/$action?/$id?"(controller: "adminController1")
"/admin/adminController2/$action?/$id?"(controller: "adminController2")
看看:


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

因此,今天我根据以下内容实施了解决方案:


谢谢你的回答!我知道这些选择。我需要的是为所有管理员控制器配置URL的简单方法,因此我不必为每个管理员控制器手动编写映射,只需将它们放在正确的包中即可。谢谢!你说的“grails嵌入式插件”是指我应该创建一个用于管理的插件,然后将该插件安装到我的应用程序中吗?通常我有一个主grails项目用于主应用程序。然后我将此项目用作“admin”-grails项目的插件。此应用程序包含一组脚手架控制器和视图,一些管理控制器和服务,以及限制身份验证设置。我运行的这个应用程序是一个完全独立的应用程序(可能运行在与主应用程序不同的主机上)。
// 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
            }
        }
    }
}