Считывание всех действий в Grails-Controller - PullRequest
6 голосов
/ 02 июня 2010

Мне нужно прочитать все доступные действия с любого контроллера в моем веб-приложении. Причиной этого является система авторизации, в которой мне нужно предоставить пользователям список разрешенных действий.

т.д .: Пользователь xyz имеет полномочия на выполнение действий show, list, search. Администратор пользователя имеет полномочия на выполнение действий редактирования, удаления и т. Д.

Мне нужно прочитать все действия с контроллера. У кого-нибудь есть идея?

Ответы [ 5 ]

9 голосов
/ 02 июня 2010

Это создаст список карт (переменная data) с информацией контроллера. Каждый элемент в списке представляет собой карту с ключами 'controller', соответствующими URL-имени контроллера (например, BookController -> 'book'), controllerName, соответствующим имени класса ('BookController'), и 'actions', соответствующими Список имен действий для этого контроллера:

import org.springframework.beans.BeanWrapper
import org.springframework.beans.PropertyAccessorFactory

def data = []
for (controller in grailsApplication.controllerClasses) {
    def controllerInfo = [:]
    controllerInfo.controller = controller.logicalPropertyName
    controllerInfo.controllerName = controller.fullName
    List actions = []
    BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(controller.newInstance())
    for (pd in beanWrapper.propertyDescriptors) {
        String closureClassName = controller.getPropertyOrStaticPropertyOrFieldValue(pd.name, Closure)?.class?.name
        if (closureClassName) actions << pd.name
    }
    controllerInfo.actions = actions.sort()
    data << controllerInfo
}
5 голосов
/ 22 мая 2013

Вот пример, который работает с Grails 2, то есть он будет захватывать действия, определенные как методы или замыкания

import org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass
import java.lang.reflect.Method
import grails.web.Action

// keys are logical controller names, values are list of action names  
// that belong to that controller
def controllerActionNames = [:]

grailsApplication.controllerClasses.each { DefaultGrailsControllerClass controller ->

    Class controllerClass = controller.clazz

    // skip controllers in plugins
    if (controllerClass.name.startsWith('com.mycompany')) {
        String logicalControllerName = controller.logicalPropertyName

        // get the actions defined as methods (Grails 2)
        controllerClass.methods.each { Method method ->

            if (method.getAnnotation(Action)) {
                def actions = controllerActionNames[logicalControllerName] ?: []
                actions << method.name

                controllerActionNames[logicalControllerName] = actions
            }
        }
    }
}
4 голосов
/ 18 октября 2013

Чтобы распечатать список всех методов с именами действий:

   grailsApplication.controllerClasses.each {
               it.getURIs().each {uri ->
                 println  "${it.logicalPropertyName}.${it.getMethodActionName(uri)}"
               }
   }
4 голосов
/ 22 мая 2012

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

def actions = new HashSet<String>()
def controllerClass = grailsApplication.getArtefactInfo(ControllerArtefactHandler.TYPE)
                         .getGrailsClassByLogicalPropertyName(controllerName)
for (String uri : controllerClass.uris ) {
    actions.add(controllerClass.getMethodActionName(uri) )
}

Переменные grailsApplication и controllerName вводятся через grails. Поскольку сам контроллер не имеет необходимых методов, этот код извлекает его controllerClass (см. GrailsControllerClass ), который имеет то, что нам нужно: свойство uris и метод getMethodActionName

0 голосов
/ 15 апреля 2019

Мне пришлось вытащить список всех контроллеров и их соответствующие URI. Это то, что я сделал с приложением Grails 3.1.6.

grailsApplication.controllerClasses.each { controllerArtefact ->
            def controllerClass = controllerArtefact.getClazz()
            def actions = controllerArtefact.getActions()
            actions?.each{action->
                def controllerArtefactString = controllerArtefact.toString()
                def controllerOnly = controllerArtefactString.split('Artefact > ')[1]
                println "$controllerOnly >>>> $controllerOnly/${action.toString()}"
            }
        }
...