Доступ к полю класса домена на основе ролей в Grails

Я разрабатываю приложение Grails. В некоторых случаях я хочу управлять полями класса домена на основе роли. Так что при каждом вызове метода getter setter класса домена я хочу применить некоторый фильтр на основе роли (вошедшая в систему роль пользователя ). Я предполагаю, что 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;" эта строка должна работать только для определенной роли. Для какой-либо другой роли она должна вызывать исключение.

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

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


person DonX    schedule 14.02.2010    source источник


Ответы (2)


Вы можете создать методы 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
    }
}

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

person John Wagenleitner    schedule 14.02.2010

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

EDIT: Вот пример того, о чем я думал. Вы могли бы обобщить немного больше, и код здесь не тестировался, поэтому он, вероятно, не будет работать как есть.

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)
        }
    }
person Blacktiger    schedule 15.02.2010
comment
Конечно, я отредактировал пост, чтобы дать образец того, что я думал. - person Blacktiger; 16.02.2010