Подтвердить что ты не робот

Конфигурация отображения URL-адресов Dynamic Grails

Как я могу динамически строить список сопоставлений - вместо:

class UrlMappings {
static mappings = {
   "/helpdesk/user/$action?/$id?" (controller="helpdeskuser")
   "/helpdesk/group/$action?/$id?" (controller="helpdeskgroup")
   "/helpdesk/company/$action?/$id?" (controller="helpdeskcompany")
   "/helpdesk/account/$action?/$id?" (controller="helpdeskaccount")
   "/admin/company/$action?/$id?" (controller="admincompany")
   "/admin/account/$action?/$id?" (controller="adminaccount")
 }
}

что-то вроде этого псевдокода:

class UrlMappings {
static mappings = {
   application.controllerClasses.each {
     if(it.name.startsWith('helpdesk'))
        "/helpdesk/${it.name}/$action?/$id?" (controller="${it.name}")
     if(it.name.startsWith('admin'))
        "/admin/${it.name}/$action?/$id?" (controller="${it.name}")
   }
 }
}

(Я не понимаю, что такое статические сопоставления - хеш-карта? свободные переменные?)

То, что я пытаюсь достичь, - это сопоставления на основе типа контроллера. служба поддержки, администратор или пользовательские контроллеры. Как только я настроил сопоставления, я хочу добавить безопасность на основе URL-адресов, но я не хочу отображать каждый контроллер отдельно:

grails.plugins.springsecurity.interceptUrlMap = [
   '/helpdesk/**':   ['ROLE_HELPDESK','ROLE_ADMIN'],
]
4b9b3361

Ответ 1

Я только что сделал следующее в своем приложении:

import org.codehaus.groovy.grails.commons.ApplicationHolder

class UrlMappings {
  static mappings = {        
    for( controllerClass in ApplicationHolder.application.controllerClasses) {
      // Admin Controllers first
      if( controllerClass.name.startsWith("Admin")){
        // note... fixes the case so that AdminUserController maps to /admin/user
        "/admin/${controllerClass.name[5].toLowerCase() + controllerClass.name[6..-1]}/$action?/$id?" {
          controller = "admin${controllerClass.name[5..-1]}".toString()
        }
      }
    }
  }
}

Я бы на самом деле не делал этого раньше, ваш вопрос побудил меня исправить это мое приложение. Это была одна из тех вещей, которые я пытался сделать какое-то время.

Ответ 2

GrailsUrlMappingsHolder bean доступен в службах и контроллерах. Хотя конкретная реализация UrlMappingsHolder не имеет метода добавления, его суперкласс выполняет. Простой, как это в grails 2.3.4

def grailsUrlMappingsHolder

def addMapping() {        
    grailsUrlMappingsHolder.addMappings({
        "/admin"(controller:"admin" action:"index")  
    });        
}

Ответ 3

Я хотел добиться чего-то подобного для своего приложения и нашел хороший способ, предоставляемый граалями. Это похоже на

name admin: "/admin/$cName/$action/$id?" {
    controller = {
        "admin" + params.cName.capitalize()
    }
}

Остерегайтесь, это не сработает, если вы используете $controller vs. $cName (или что бы вы там ни хотели) и вместо этого вместо него будет исключать NullpointerException.

В качестве бонуса вы можете использовать имя сопоставления, например

<g:createLink 
    controller="adminBackend" action="login" 
    mapping="admin" params="[cName:'backend']"
/>

чтобы получить ссылку на /admin/backend/login - Надеюсь, это поможет!

Оставайтесь свежими!

Ответ 4

Вы можете вставить переменную $controller, см. документацию .

static mappings = {
   "/helpdesk/$controller/$action?/$id?"()
}

BTW, отображения в controller и, необязательно, их view заключены в нормальные скобки (), а не фигурные {}.

Такие Groovy скрипты (как UrlMappings.groovy) анализируются экземпляром ConfigSlurper, который, наконец, преобразует их в ConfigObject, что implements Map. По общему признанию, я либо не уверен, как этот синтаксический анализ выполняется подробно.

ИЗМЕНИТЬ

Здесь UrlMappings.groovy, который приближается к тому, что вы хотите. (Искать "/$_ ctrl/$_ action/$id?".) Код, BTW, оценивается во время выполнения. Тем не менее, я не смог запустить grailsApplication.

Другая идея заключалась в том, чтобы добавить javax.servlet.Filter в веб-приложение, то есть подклассифицировать Grails UrlMappingsFilter.