Ролевый доступ к полям классов домена в Grails - PullRequest
3 голосов
/ 14 февраля 2010

Я занимаюсь разработкой приложения grails. В некоторых случаях я хочу управлять полями класса домена на основе роли. Так что при каждом вызове метода установки метода получения класса домена я хочу применить некоторый фильтр на основе роли в роли пользователя). Я предполагаю, что grails создаст метод установщика getter во время выполнения для доминирующих классов. Так что при написании кода grails можно применить эту логику.

Пример:

Класс домена:

class Book{
   String name;
   double price;

  }

Контроллер:

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

В приведенном выше коде "println book.price;" эта строка должна работать только для определенной роли. Для какой-то другой роли она должна выдавать какое-то исключение.

Возможно ли добиться? Есть ли плагин для этого?

Пожалуйста, помогите ... Спасибо

Ответы [ 2 ]

1 голос
/ 14 февраля 2010

Вы можете создавать методы get / set для свойств, к которым вы хотите управлять доступом, и размещать там свою логику безопасности. Предполагая, что вы написали свою собственную службу безопасности или используете плагин безопасности, такой как плагин Spring Security (Acegi), вы бы:

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

Мне не известен ни один плагин, позволяющий устанавливать контроль доступа к свойствам домена.

0 голосов
/ 15 февраля 2010

Вы также можете рассмотреть возможность использования пользовательского валидатора или объекта ошибок пружины для отлова попыток установить поле перед его сохранением.

РЕДАКТИРОВАТЬ: Вот пример того, что я думал. Вы можете обобщить немного больше, и код здесь не был протестирован, поэтому он, вероятно, не будет работать как есть.

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)
        }
    }
...