3

grailsアプリケーションを開発しています。その場合は、役割に基づいてドメインクラスのフィールドを制御したいので、ドメインクラスのgetter setterメソッドを呼び出すたびに、役割に基づいてフィルターを適用します(ユーザーの役割にログインしました)。 ).grailsは実行時にdominクラスのgetter setterメソッドを作成すると想定しています。したがって、grailsコードを記述しているときに、このロジックを適用することは可能です。可能であれば、どのように適用するのですか?

例:

ドメインクラス:

class Book{
   String name;
   double price;

  }

コントローラ:

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

上記のコードでは、「printlnbook.price;」この行は特定の役割に対してのみ機能する必要があります。他の役割については、いくつかの例外をスローする必要があります。

達成することは可能ですか?これを行うためのプラグインはありますか?

これについて助けてください....ありがとう

4

2 に答える 2

1

アクセスを制御するプロパティの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
    }
}

アクセス制御をドメインプロパティに配置できるプラグインを知りません。

于 2010-02-14T16:41:59.510 に答える
0

カスタムバリデーターまたはスプリングエラーオブジェクトを使用して、フィールドを保存する前にフィールドを設定する試みをキャッチすることも検討できます。

編集:これは私が考えていたものの例です。もっと一般化することができますが、ここのコードはテストされていないため、そのまま実行されない可能性があります。

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)
        }
    }
于 2010-02-15T16:07:33.753 に答える