2011-08-16 13 views
1

Webサービスでユーザーの権限が頻繁に変更されます。
この場合、ユーザーの権限を効果的にチェックするにはどうすればよいですか?spring3コントローラメソッドでユーザーの現在の権限を確認するにはどうすればよいですか?

すべてのコントローラでユーザーの権限を一時的にチェックするコードを書きました。 しかし、私はこの方法はメンテナンスのためには良くないと思う。

コントローラごとにチェック方法を書き込まずにユーザーの権限を確認するにはどうすればよいですか?

+0

ここで素敵なラッパーを使用することもできます:http://stackoverflow.com/a/3412166/26510 –

答えて

1

あなたがやっていることがわかりません - Spring Securityは自動的にユーザーのセキュリティコンテキストで権限を追跡します。他の理由でプログラムでチェックする必要がある場合は、HandlerInterceptorインターフェイスを実装し、preHandleメソッドではSecurityContextHolder.getContext().getAuthentication()を呼び出して現在のユーザーを取得します。ユーザーの権限を確認することができます。次のように

インターセプタを設定することになります。

<mvc:interceptors> 
    <bean class="com.my.package.MyInterceptor" /> 
</mvc:interceptors> 
0

は例えば、必要とされる役割を使用して設定するintercept-url要素を追加します。

0
<http auto-config='true'> 
    <intercept-url pattern="/**" access="ROLE_FOO" /> 
</http> 

使用HandlerMethodArgumentResolverスプリングは、コントローラ方式でGrantedAuthorityを注入できるようにします。ユーザーが複数の権限を持つことができる場合は、ユーザーの権限を保持するクラスを作成する必要があります(名前はGrantedAuthoritiesとなります)。あなたが完了したら、あなたのコントローラのメソッドは次のようになります:

@RequestMapping({"/xyz"}) 
public String handleXYZRequest(GrantedAuthorities authorities) { 
    /* use authorities if not null */ 
    ... 
} 

リゾルバでは、あなたが現在当局を取得するために使用している同じコードを使用し、それがnullまたはGrantedAuthoritiesオブジェクトのいずれかを返します。旧バージョンのSpringを使用している場合は、WebArgumentResolverを使用してAnnotationMethodHandlerAdapterに登録してください。

上記のアプローチは、コードの重複を避け、コントローラーメソッドでSecurityContextHolderから必要なものを注入するために使用できます。

編集

これは、温室で使用されるアプローチと同様です。プリンシパル(アカウントオブジェクト)が引数リゾルバを介してコントローラに挿入されているWebConfigを参照してください。

関連する問題