3

これは基本的な質問のようですが、明確な答えは見つかりませんでした。Grailsでspring-security-coreプラグインを使用していますが、多くのポートフォリオを持つS2Usersがあり、Portfoliosには多くのトランザクションがあります。

足場ビューに移動してトランザクションを調べるとき、各ユーザーが自分のトランザクションのみを表示していることをどのように知ることができますか?逆に、すべてのユーザーのすべてのトランザクションを表示できるユーザーを作成するにはどうすればよいですか?

デフォルトの動作が何であるか、Grails / Spring-Securityが、特定のドメインクラスをすべてのユーザーに表示するか、関連付けられたユーザーのみに表示するかをどのように認識するかは、私にはわかりません。

4

3 に答える 3

4

足場ビューに移動してトランザクションを調べるとき、各ユーザーが自分のトランザクションのみを表示していることをどのように知ることができますか?

正しく機能するには、スキャフォールドビューを変更する必要があります。

@Secured(['ROLE_USER'])
def list() {
   def authenticatedUser = User.findByUsername(springSecurityService.principal.username)
   def transactions = Transaction.findAllByUser(authenticatedUser)
   [transactions: transactions]
}

上記は、認証されたユーザーのみがlist()メソッドにアクセスすることを許可し、ログインしたユーザーのすべてのトランザクションを取得します。

逆に、すべてのユーザーのすべてのトランザクションを表示できるユーザーを作成するにはどうすればよいですか?

それらすべてを表示できるユーザーを作成するのではなく、特定のユーザーがそれらすべてを表示できるようにするメソッドをコントローラーに作成します。次に例を示します。

@Secured(['ROLE_USER', 'ROLE_ADMIN'])
def list() {

   def authenticatedUser = User.findByUsername(springSecurityService.principal.username)
   def transactions = []
   if (SpringSecurityUtils.ifAnyGranted('ROLE_ADMIN')) {
       transactions = Transaction.list()
   }else{
       transactions = Transaction.findAllByUser(authenticatedUser)
   }
   [transactions: transactions]
}

とにかく、そのようなもの。必要に応じて微調整します。

于 2012-11-09T02:33:03.767 に答える
3

これを支援するプラグインがあります。私はその正確な目的のためにHibernateFilterプラグインを使用しています。これは、各ユーザーが自分のデータのみを表示できるようにSQLを制限するのに役立ちます。次に、HibernateFilterFiltersの独自の実装でオーバーライドできます。これにより、ユーザーがROLE_ADMINを持っている場合にすべてのフィルターが無効になります(プラグインからソースをコピーして適応させます)。

マルチテナンシー用のプラグインもいくつかありますが、それらのメンテナンスは私にはわからないようです。私はHibernateFilterプラグインが好きです。シンプルでわかりやすいですが、プラグインがGrails / GORMにフックする方法のため、すべての.get()呼び出しを.findById()に変更する必要があります。

于 2012-11-09T09:18:35.863 に答える
2

データアクセスルールがより複雑で、すべてのアプリケーションコードで適用する必要がある場合は、spring-security-aclプラグインを使用できます。

于 2012-11-09T09:12:49.463 に答える