Grails con Spring Security Core solo permite al propietario actualizar en GSP

Esta pregunta tiene algún código para agregar al cierre del controlador, lo cual está bien, pero ¿qué pasa si quiero usar las vistas de andamio predeterminadas de Grails pero solo aparecen los botones de edición / actualización si el usuario es un administrador, o el objeto de dominio es propiedad del ¿usuario? Leer la documentación, He intentado:

<sec:access expression="hasRole('ROLE_MANAGER') || (projectInstance.owner == springSecurityService.currentUser)">
   <span class="button"><g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /></span>
</sec:access>

Pero la clase de acceso no parece permitir OR:

Error processing GroovyPageView: Error executing tag <g:form>: Error executing tag <sec:access>: Cannot handle (124) '|' 

¿Alguien hizo algo similar?

preguntado el 16 de mayo de 11 a las 19:05

1 Respuestas

Decidí que sería una estupidez. Un mejor enfoque es hacerlo en el controlador como:

 def edit = {
    def projectInstance = Project.get(params.id)
    def managerOrAdmin = SpringSecurityUtils.ifAnyGranted('ROLE_ADMIN,ROLE_MANAGER')
    def editable = (projectInstance.owner == springSecurityService.currentUser
                   || managerOrAdmin)
    if (!projectInstance) {
        flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'project.label', default: 'Project'), params.id])}"
        redirect(action: "list")
    }
    else {
        return [projectInstance: projectInstance, editable:editable]
    }
}

y luego en el gsp hacer

<g:if test="${editable}">
  <span class="button"><g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /></span>
</g:if>

lo cual tiene sentido, si seguimos el mantra de buena programación de "las vistas deberían tener la menor lógica de procesamiento posible en MVC"

contestado el 17 de mayo de 11 a las 21:05

Estoy de acuerdo con este enfoque ya que su expresión es un poco más compleja que una simple verificación de roles. - Gregg

Si necesito esto en varias acciones, me pregunto si es mejor usar el método beforeUpdate en el objeto. - Adrián Rodríguez

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.