2011-07-08 21 views
4

UserGroupのいくつかの基本認証フレームワークを検討してください。メソッドへのアクセスは、メソッドを実行するために必要なPriviledgeLevelがあることを確認するチェックで保護されていなければ失敗します。基本的にチェックするコードが、このようにそれを実装することが可能アノテーションを使用してメソッドレベルのアクセスチェックを実装することは可能ですか?

if(currentUser.getPriviledgeLevel >= PriviledgeLevel.ADMINISTRATOR || 
    currentUser.getGroup.priviledgeLevel >= PriviledgeLevel.ADMINISTRATOR) 
    // Allow access 
else 
    // Deny access  

をだろうん

@AccessCheck(PriviledgeLevel.ADMINISTRATOR) 
public static void secureMethod(){ ... } 

:私が想像する何

はこのようなものでしょうか?

Security Annotation Framework(SAF)とSpring Securityを中心に、AspectJに基づいていくつかの既存のものを指しています。

SAFはもはやそれほどアクティブではないようで、ドキュメンテーションはそれほど大きくないので、少し気になります。

私はSpring Securityについてはわかりませんが、Web関連のトピックのセキュリティ上の問題に重点を置いているようです。

Java Authentication and Authorization Serviceは関連しているようですが、アノテーションアプローチを使用していません。

この宣言的なアプローチでこれらのセキュリティ要件を定義しようとすると意味がありますか?

私は紛失している別のライブラリ/フレームワークがありますか?既に必要なものやここで関連する技術を実装していますか?

(私自身のClassLoaderの実装のような)完全に異なる解決策がありますか?(ライブラリユーザーの簡潔さと可読性という点で)私が想像しているものより優れていますか?

+0

スプリングセキュリティは、トップからボトムのソリューションであり、Web関連のセキュリティだけではありません。実際に私は、WebセキュリティでALSOを使用する前に、自分のビジネス層で春のセキュリティを使用し始めました。 – bluefoot

答えて

1

私はAspectJがあなたがしたいと思うと思います。特定のアクセス権が必要なメソッドがたくさんあり、AspectJのアスペクトを作成しました。このAspectJアスペクトは、ユーザーがそのパーミッションを持っていない場合にそれをチェックしてエラーを出します。

AspectJはコンパイル時にクラスに「組み込む」ため、設定によって無効にすることはできません。

また、Spring Securityを使用して、両方をハーモニーで使用することもできます。Spring Security

1

動的プロキシを使用することで、これをかなり自明に行うことができます。

public interface MyInterface { 
      @AccessCheck(Privilege.ADMIN) 
      public void doSomething(); 
} 

プロキシは、インターフェイスを実装するクラスに作成され、カスタム注釈でインターフェイスに注釈を付けます。プロキシの呼び出し()メソッドで

MyInterface aInterface = (MyInterface) java.lang.reflect.Proxy.newProxyInstance(obj.getClass() 
       .getClassLoader(), obj.getClass().getInterfaces(), 
       new YourProxy(new Implementation()); 

、あなたはあなたの方法は、注釈を持っているかどうかを確認し、権限が満たされていない場合に、SecurityExceptionを投げることができます。

public YourProxy implements InvocationHandler { 
     .... 
     public Object invoke(Object proxy, Method method, Object[] args) 
     throws Throwable { 

       if (method.isAnnotationPresent(AccessCheck.class) { 
        ....// do access check here and throw SecurityException() 
     } 
} 
1

、あなただけ追加する必要があります。場合(クエリをカスタマイズし、あなたのUserDetailsService

  • enable group support
  • として

    1. 使用JdbcDaoImpl

      @Secured("ADMINISTRATOR") 
      public static void secureMethod(){ ... } 
      

      をANDで、それを適切に設定しますデータベース資格情報ストレージを使用しています)

    データベース資格情報ストレージを使用していない場合は、UserDetailsServiceを設定して、ユーザー資格とグループ資格情報の両方を、生成されたUserDetailsの権限に追加します。

    documentationでコンセプトをチェックせずに理解するのは難しいですが、春のセキュリティではメソッドレベルのアクセスチェックが完全に可能で、それは私の好みの技術です。

  • +1

    はい、Spring Securityは作業を簡単にします。本当に柔軟性があり、ほとんどどこでも動作を設定することができます。デフォルトではWebアプリケーション用ですが、メソッドや呼び出しをパターンやJSPの断片で保護することができます。もちろん、これを拡張して独自の方法でセキュリティを実装することもできます –

    0

    スプリングセキュリティでは、the docsの状態として、@Secured@PreAuthorizeの両方をメソッドレベルで使用できます。

    @PreAuthorizeを有効にするには... <global-method-security pre-post-annotations="enabled" /> を設定XMLに入力する必要があります。

    @Securedについては、<global-method-security secured-annotations="enabled" />を使用してください。

    詳細については、this articleを参照してください。