2

ドメインクラスのプロパティへの呼び出しをインターセプトして、アクセス制御を実装したいと思います。

私の最初の試みは、setPropertyとgetPropertyをオーバーライドすることでした。これを行うことで、Grailsドメインクラスのすべての優れた機能を無効にしました。

domainClass.properties = params

データ型の自動変換。

次の試みは、DelegatingMetaClassを使用することでした。これにより、少なくとも実際の呼び出しに関するいくつかの優れたログメッセージを出力することができました。しかし、実際のオブジェクトにアクセスして権限を評価する方法を理解できませんでした。

最後に、実際のオブジェクトにアクセスできるので、groovy.lang.Interceptorは良い選択のようです。しかし、これは正しい方法ですか?すべてのドメインクラスを強制的にインターセプトするにはどうすればよいですか?

よろしくお願いします。

よろしく、ダニエル

4

1 に答える 1

4

実際のバージョンを参照している限り、getPropertyとsetPropertyをオーバーライドできます。このようなコードをBootStrapに追加して、すべてのドメインクラスのインターセプターを追加します。

class BootStrap {

   def grailsApplication

   def init = { servletContext ->

      for (dc in grailsApplication.domainClasses) {
         dc.class.metaClass.getProperty = { String name ->
            // do stuff before access
            def result
            def metaProperty = delegate.class.metaClass.getMetaProperty(name)
            if (metaProperty) {
               result = metaProperty.getProperty(delegate)
            }
            else {
               throw new MissingPropertyException(name, delegate.class)
            }
            // do stuff after access
            result
         }

         dc.class.metaClass.setProperty = { String name, value ->
            // do stuff before update
            def metaProperty = delegate.class.metaClass.getMetaProperty(name)
            if (metaProperty) {
               metaProperty.setProperty(delegate, value)
            }
            else {
               throw new MissingPropertyException(name, delegate.class)
            }
            // do stuff after update
         }
      }
   }

   def destroy = {}
}
于 2010-02-11T18:58:12.393 に答える