0

Grails ドメイン オブジェクトへのアクセスを全面的にオブジェクトの所有者に制限する方法はありますか?

たとえば、私はassert簡単に作ることができますが、それをどこにでも複製したり、スポットを逃したりするリスクを冒したくありません.

これは単なるテナント ID ではなく、さまざまなドメイン オブジェクトの特定のビジネス ロジックである可能性があるため、マルチテナンシーとまったく同じではありません。

class MyDomain {
  String name
  String user
}

class MyController {
  def show(Long id) {
    def obj = MyDomain.get(id)
    // *** How do I not do copy-paste this line in each individual controller 
    // that touches MyDomain?? *** 
    assert obj.user == CURRENT_USER

    return obj
  }
}
4

3 に答える 3

1

他の回答が示唆しているように、このようなシナリオを処理する方法はたくさんありますが、 Spring Security Pluginspring-security-acl pluginを使用するのが適切な方法だと思います。ACL プラグインはオブジェクト レベルにドリルダウンし、制御に役立ちます

ドキュメントによると

「ACL プラグインは、Spring Security を使用する Grails アプリケーションに Domain Object Security サポートを追加します。」

セキュリティ コアと ACL の両方を組み合わせることで、必要なことを達成できます。

于 2013-08-23T02:10:30.260 に答える
0

ドメイン レベルで実行できるかどうかはわかりませんが、1 つの方法はフィルターを使用することです。Grails で使用できるフィルター プラグインがあります。ユーザーをセッションに保持し、リクエストごとにフィルターで検証します。

サンプル フィルタ コード:

class SecurityFilters {
    def filters = {
        loginCheck(controller: '*', action: '*') {
            before = {
                if (!session.user && !actionName.equals('login')) {
                    redirect(action: 'login')
                    return false
                }
            }
        }
    }
}

フィルター属性を指定します。

ドキュメント grails.org/doc/2.2.1/ref/Plug-ins/filters.html は次のとおりです。

于 2013-08-23T00:12:10.220 に答える
0

フィルターは 1 つの方法かもしれませんが、別の方法は、可能であればクエリを調整することです。おそらく、ID 以外の条件で検索できる必要があるでしょう。ユースケースをもう少し理解しないと、より良い答えを出すのは困難です。

def show(String someValue) {
  def currentUser = howeverYouGetYourUser
  def obj = MyDomain.findByUserAndSomeValue(currentUser, someValue)
  if (obj) {
    // yeah!!!
  } else { 
    // boo!!
  } 
}

理想的には、特定のユーザーの特定のデータを探している場合、ID は実際には適していません。

于 2013-08-22T22:50:46.743 に答える