質問

Grailsを使用して、主にサービスフレームワークとして機能するアプリケーションを構築しています。私の質問は、サービスをコントローラーと同じ方法で保護できますか?

URIベースの例:

class SecurityFilters {
  def filters = {
    all(uri: "/**") {
      before = {
        // Ignore direct views (e.g. the default main index page).
        if (!controllerName) return true
        // Access control by convention. 
        accessControl()
      }
    } 
  } 
}
役に立ちましたか?

解決

シロプラグインがこれをサポートしているかどうかはわかりませんが Acegiプラグイン 「実験的な」方法ではあるが(それが何であれ)、そうである。

アップデート

質問を適切に読んだので、サービスを保護するためにフィルターを使用できるかどうかを尋ねているようです。この場合、シロはシロではなく承認を実行しているのはフィルターであるため、シロはやや無関係です。

したがって、フィルターを使用してサービスを保護できるかどうかについての質問に答えるために、答えはノーです。これは、フィルター内からコントローラーにのみアクセスできるからです。ただし、グルーヴィーなメタプログラムを使用して、サービスでAOPスタイルのメソッドインターセプトを行うことができます。

基本的なアプローチは次のとおりです。

  • 各サービスについて、追加します invokeMethod メタクラスへのプロパティ
  • このプロパティの価値は閉鎖でなければなりません。この閉鎖は、サービスで呼び出される各メソッドをインターセプトします(つまり、すなわち呼び出されます)。
  • この閉鎖は必要です
    • セキュリティチェックを実行します
    • 許可が成功した場合は元の方法を呼び出し、承認が失敗した場合は例外をスロー(またはエラーを表示)します

さておき

可能であれば、上記の方法で自分のものを転がすのではなく、承認チェックを実行するために、実績のあるセキュリティプラグイン(Shiro、Acegiなど)を使用することを強くお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top