1

プロジェクトでGrailsセキュリティプラグインを使用しています。コントローラアクションの注釈を使用して、「ROLE_ADMIN」や「ROLE_USER」などの特定のクラスのユーザーへのアクセスを制限しています。

(これを私が行っていることの基礎として使用します:http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/5%20Configure%20Request%20Mappings%20to%20Secure% 20URLs.html#5.1%20Defining%20Secured%20Annotations

私の質問は、ユーザーが自分自身に関する情報しか見ることができないように、アクションを制限するにはどうすればよいかということです。たとえば、id=1のユーザーがいるとします。次の場所にユーザーに関する情報を表示するアクションがある場合。

mySite/User/Show/1

id=1の同じユーザーがアクセスできないようにするにはどうすればよいですか

mySite/User/Show/2

?これを行う簡単な方法はありますか?

4

5 に答える 5

1

次の問題は何でしょうか?:

class SomeController {
    springSecurityService
    // other stuf ...
    def show () {
       User user = User.get(params)
       User logged = User.get(springSecurityService.principal.id)
       if (user.id != logged.id) {
          flash.message = "You can't see the profile of other users"
          redirect action:"list" // You can redirect to other controller/action
          return //Since grails 2 this is needed
       }
       // Logic for display your user
    }
    // other stuf ...
}
于 2012-04-06T01:02:35.190 に答える
1

同じロジックを複数のアクションに適用する場合は、Grailsコントローラーインターセプターを使用することもできます

class SomeController {

 def beforeInterceptor = [action: this.&checkUser ] 

   def springSecurityService

def checkUser() {
    User user = User.get(params)
       User logged = User.get(springSecurityService.principal.id)
       if (user.id != logged.id) {
   {
       redirect(action: "accessDenied", controller='access' id: params.long("id")) //re-direct accessDenied page
   return false
   }
    return true;
}

}

   Class AccessController{
     def accessDenied= {

        render(view: "accessDenied")

    }
 }
于 2012-04-06T20:28:19.920 に答える
0

あなたが求めているのはあなたのビジネスルールの一部です。したがって、プラグインやヘルパーコードを探すのではなく、コードでこれらのシナリオを処理する必要があります。

このためにできることは、ユーザーの詳細にアクセスするユーザーのIDが、詳細が質問されているユーザーのIDと同じであることを確認することです。

オブジェクトレベルでこのチェックを行うこともできますが、これは、ユーザーの詳細を取得するためのデータベースへの追加のクエリを意味します。

お役に立てれば。

于 2012-04-06T00:59:54.317 に答える
0

セキュリティ面でビジネスルールを実装しようとしていることに同意する必要があります。ユーザーが何らかのドキュメントを作成した場合、承認を使用してプロファイルページに表示されるものを選択することはありませんか?

承認の側面がどこに到達し、ビジネスルールがどこから始まるかについて線を引く必要があります。

私の経験では、境界線がぼやけないように、一連の機能に関連付けられたユーザーのタイプとして常に承認ロールを使用しています。特定のユーザータイプは、一連のストーリーまたはユースケースにアクセスできます。これらのユースケースは、特定の役割に制限されています。

データの可視性(ビジネス要因に応じて、ページに何が隠されているか)について質問し始める場合は、セキュリティフレームワークに近づかないようにする必要があります。

于 2012-04-11T13:21:36.590 に答える
0

ビジネスロジックとセキュリティロジックを再定義する必要があることに同意しません。これは一般的な使用例であり、承認によってカバーされる必要があります。これがGrailsにフィルターがある理由です。承認フィルターを使用して、次のような機能を追加します。

class AuthorizationFilters {
    def filters = {
        userCheck(controller: 'user', action: '*') {
            before = {
                // Check current user id is param.id here
            }
        }
    }
}

したがって、セキュリティロジックはコントローラの外部にあります。ここで、ドメインクラスが現在のユーザーによって所有されているかどうかを確認するユーザーIDまたは他のメソッドを渡す場合は、他のコントローラーを追加できます。

于 2013-05-01T18:48:18.953 に答える