2

私は Google Web Toolkit を使用しており、春のセキュリティでサーバーを保護しています。ビジネス オブジェクト メソッドで @PreAuthorize アノテーションを使用したいと考えています。

ここでの問題は、AccessDeniedException (ユーザーがこのメソッドを呼び出す権限がない場合にスローされる) が GWT によってシリアライズ可能でないことです。そのため、BO メソッドを呼び出すすべての RPC サービス メソッドに追加の try-catch を実装して、手動で例外を変換する必要があります。この追加の try-catch は本当に避けたいです。

もう少し説明:

BO ( @PreAuthorize で保護) << によって呼び出される >> GWT RPC は、例外を変換するために追加の try-catch を必要とします。

私が見つけたのは、特定の例外を特定のページにマップするマッパーだけですが、例外を別の例外に変換する方法に関する情報はありません (または、カスタム例外をスローする独自の実装を提供します)。

皆さんが理解できる方法で私の問題を説明できれば幸いです。

このスレッドを見つけました:

http://forum.springsource.org/showthread.php?85937-Method-Security-Throw-custom-exception-instead-of-AccessDeniedException

しかし、AccessDecisionManager は AccessDeniedException のみをスローするため、ニーズに合わせてカスタマイズする方法についてアドバイスを得ることができません。

前もって感謝します!

4

3 に答える 3

1

これは、 Spring AOP を使用したMaksim Demidasのソリューションの開発です。

「アドバイスを投げる」タイプの Spring AOP アドバイスを定義します。@Securedまたはなどの他のアドバイスと正しく統合するために、インターフェース Ordered with HIGHEST_PRECEDENCE を実装します。@PreAuthorize

public class AccessDeniedExceptionInterceptor implements ThrowsAdvice, Ordered {

    public void afterThrowing(AccessDeniedException e) throws GwtAccessDeniedException {

        throw new GwtAccessDeniedException();
    }

    @Override
    public int getOrder() {
        return HIGHEST_PRECEDENCE;
    }
}

Spring コンテキスト ファイルで、インターセプターを Bean として定義します。

<bean id="accessDeniedExceptionInterceptor" class="my.interceptor.package.AccessDeniedExceptionInterceptor"/>

Spring コンテキスト ファイルで、保護されたオブジェクトを構成します。この例では、特定の実装のすべてのパブリック メソッドが保護されています。

<!-- Configure global method security for the secured object -->
<security:global-method-security>
    <security:protect-pointcut access="ROLE_USER" 
            expression="execution(public * my.service.package.ServiceImpl.*(..))"/>
</security:global-method-security>

サービス実装 Bean を定義します。

<bean id="rpcServiceTarget" class="my.service.package.ServiceImpl"/>

サービスのプロキシを定義し、インターセプターに接続します。

<bean id="rpcService" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces" value="my.service.package.Service"/>
    <property name="target" ref="rpcServiceTarget"/>
    <property name="interceptorNames">
        <list>
            <value>accessDeniedExceptionInterceptor</value>
        </list>
    </property>
</bean>

以上です。プロキシを使用すると、Spring の AccessDeniedException からカスタム GwtAccessDeniedException に変換されます。

于 2014-09-03T17:07:31.950 に答える
1

Spring Security に AccessDeniedException の代わりに別の型を使用するように指示する方法がわかりません。したがって、どこかに try/catch ブロックを配置し、例外の種類を変更する必要があると思います。それを行う場所は複数あります。

  • クラスを使用するように Spring Security をオーバーライドMethodSecurityInterceptorして構成できます。ここでは、任意の例外タイプをスローできるため、変換に問題はありません。しかし、confを行うのはもっと難しいと思います。
  • すべての着信 RPC 呼び出しが 1 つのサーブレット / コントローラー (ここのように) を通過するソリューションを使用する場合は、そこに変換ロジックを適用できます。
  • おそらく最も洗練された解決策は、必要な Bean ごとにカスタム AOP インターセプター (例外ラッピングを実行できる) を適用することです。このインターセプターはorg.springframework.core.Orderedインターフェイスを実装する必要があり、HIGHEST_PRECEDENCE定数を使用して の前に実行されるようにすることができますMethodSecurityInterceptor順序付けの詳細については、このエントリを参照してください (AspectJ と標準 AOP の両方のケースで同じ Ordered インターフェースが使用されているようです)。カスタム インターセプターをPreAuthorize@Around("@annotation(org.springframework.security.access.prepost.PreAuthorize)")アノテーションに直接適用できるため、追加の conf は必要ありません。
于 2013-07-08T14:48:24.043 に答える