2010-06-02 10 views
6

Necesito leer todas las acciones disponibles desde cualquier controlador en mi aplicación web. La razón de esto es un sistema de autorización en el que debo proporcionar a los usuarios una lista de acciones permitidas.Lectura de todas las acciones en un controlador Grails

Ej .: El usuario xyz tiene la autorización para ejecutar las acciones show, list, search. El administrador del usuario tiene la autorización para ejecutar las acciones editar, eliminar, etc.

Necesito leer todas las acciones desde un controlador. ¿Alguien tiene una idea?

Respuesta

9

Esto creará una Lista de mapas (la variable 'datos') con información del controlador. Cada elemento en la Lista es un Mapa con las teclas 'Controlador', correspondiente al nombre URL del controlador (por ejemplo, BookController -> 'book'), controllerName correspondiente al nombre de la clase ('BookController') y 'actions' correspondientes a a Lista de nombres de acción para ese controlador:

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

¿este código todavía trabajan con Grails 2? Quiero decir, en Grails2, los controladores ya no son cierres – fabien7474

+3

Los cierres aún son compatibles, pero se prefieren los métodos. I 2.0 puede buscar métodos con la anotación @ grails.web.Action –

+0

@BurtBeckwith ¿Podemos obtener antes de que Interceptor use controllerClasses? – user1791574

4

Grails no es compatible con una forma directa de hacerlo. Sin embargo, yo era capaz de armar un rompecabezas de los métodos disponibles Grails y han llegado a esta solución:

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

variables grailsApplication y controllerName se inyectan por griales. Como controlador en sí no tiene métodos necesarios, este código recupera su controllerClass (ver GrailsControllerClass), que tiene lo que necesitamos: la propiedad uris y el método getMethodActionName

4

He aquí un ejemplo que funciona con Grails 2, es decir, se captará a acciones definidas ya sea como métodos o cierres

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 
      } 
     } 
    } 
} 
3

Para imprimir una lista de todos los métodos con los nombres de acción:

grailsApplication.controllerClasses.each { 
       it.getURIs().each {uri -> 
       println "${it.logicalPropertyName}.${it.getMethodActionName(uri)}" 
       } 
    } 
Cuestiones relacionadas