1

私は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()
      }
    } 
  } 
}
4

1 に答える 1

3

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

アップデート

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

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

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

  • サービスごとinvokeMethodに、MetaClassにプロパティを追加します
  • このプロパティの値はClosureである必要があります。このクロージャは、サービスで呼び出された各メソッドをインターセプトします(つまり、代わりに呼び出されます)。
  • この閉鎖は
    • セキュリティチェックを実行します
    • 承認が成功した場合は元のメソッドを呼び出し、承認が失敗した場合は例外をスローします(またはエラーを表示します)

脇白

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

于 2010-02-03T15:31:01.460 に答える