Pregunta

Estoy desarrollando una aplicación Grails. En algunos casos, quiero controlar los campos de clase de dominio según el rol. De modo que en cada llamada al método getter setter de la clase de dominio quiero aplicar algún filtro basado en el rol (registrado en el rol del usuario). ). Supongo que Grails creará un método getter setter en tiempo de ejecución para las clases de dominio. Entonces, mientras se escribe el código de Grails, es posible aplicar esta lógica. Si es posible, ¿cómo aplicarla?

Ejemplo:

Clase de dominio:

class Book{
   String name;
   double price;

  }

Controlador:

def index={
  Book book=Book.get(1);
   println book.name;
   println book.price;
 }

En el código anterior "println book.price;" Esta línea debería funcionar solo para un rol particular. Para algún otro rol debería lanzar alguna excepción.

¿Es posible lograrlo? ¿Existe algún complemento para hacer esto?

Por favor, ayuda con esto... Gracias.

¿Fue útil?

Solución

Puede crear métodos get/set para las propiedades a las que desea controlar el acceso y colocar allí su lógica de seguridad.Suponiendo que haya escrito su propio servicio de seguridad o esté utilizando un complemento de seguridad como el complemento Spring Security (Acegi), haría lo siguiente:

class Book{
    String name;
    double price;

    def authenticateService

    void setPrice(double price) {
        if(!authenticateService.ifAllGranted('ROLE_PRICE_FIXER')) {
            throw new Exception("You are not authorized to set book prices")
        }
        this.price = price
    }

    double getPrice() {
        if(!authenticateService.ifAllGranted('ROLE_PRICE_FIXER')) {
            throw new Exception("You are not authorized to get book prices")
        }
        return this.price
    }
}

No conozco ningún complemento que permita establecer controles de acceso en las propiedades del dominio.

Otros consejos

También podría considerar el uso de un validador personalizado o un objeto de errores de primavera para detectar intentos de establecer un campo antes de guardarlo.

EDITAR: Aquí hay un ejemplo de lo que estaba pensando.Podrías generalizar un poco más y el código aquí no ha sido probado, por lo que probablemente no se ejecutará tal como está.

class securedDomain {
    String securedField

    def fieldSetBy = [:]
    def previousValue = [:]
    static transients = ['fieldSetBy', 'previousValue']

    static constraints = {
        securedField(validator: { v, o ->
             def access = User.findByName(fieldSetBy['securedField']).hasAccess('securedField')
             if(!access) securedField = previousValue['securedField']
             return access
        })

    void setProperty(String name, value) {
        if(name == "securedField") {
            fieldSetBy['securedField'] = session.user
            previousValue['securedField'] = securedField
            securedField = value
        } else {
            super(name, value)
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top