2012-04-12 51 views
1

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

问候, Lojza

回答

2

所以今天我根据this article实现的解决方案:

// 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 
      } 
     } 
    } 
} 
0

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

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

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

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

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

但如果你真的希望把所有这些控制器的/管理/网址前缀下,我想你可以通过添加映射的是手动引用每个管理控制器做到这一点:

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

感谢您的回答!我知道这些选项。我需要的是为所有管理员控制器配置URL的简单方法,所以我不必为每个管理员手动编写映射,只需将它们放在正确的包中即可。 – 2012-04-16 12:26:36

0

看看:Best way to create an Admin section in Grails

然而,在这种情况下,我总是建议将你的管理区域分割成单独的grails-embedded-plugin。在这里,你可以用你自定义的UrlMapping -class来做你的魔法。这将保持您的主要应用程序清洁。

+0

谢谢!你的意思是“grails-embedded-plugin”,我应该为管理创建一个插件,然后将这个插件安装到我的应用程序中? – 2012-04-16 12:32:29

+0

通常我有主应用程序的master-grails项目。然后我使用这个项目作为“admin”-grails项目的插件。此应用程序包含脚手架控制器和视图,一些管理员控制器和服务以及限制身份验证设置。这个应用程序我作为一个完整的独立应用程序运行(可能运行在与主应用程序不同的主机上)。 – Chris 2012-04-16 14:18:27