私の Web サービスでは、ユーザーの権限が頻繁に変更されます。
この場合、ユーザーの権限を効果的にチェックするにはどうすればよいでしょうか?
すべてのコントローラーで一時的にユーザーの権限をチェックするコードを書きました。しかし、この方法はメンテナンスには適していないと思います。
すべてのコントローラーにチェックメソッドを書かずにユーザーの権限をチェックするにはどうすればよいですか?
私の Web サービスでは、ユーザーの権限が頻繁に変更されます。
この場合、ユーザーの権限を効果的にチェックするにはどうすればよいでしょうか?
すべてのコントローラーで一時的にユーザーの権限をチェックするコードを書きました。しかし、この方法はメンテナンスには適していないと思います。
すべてのコントローラーにチェックメソッドを書かずにユーザーの権限をチェックするにはどうすればよいですか?
何をしているのか不明 - Spring Security は、ユーザーのセキュリティ コンテキストで権限を自動的に追跡します。他の理由でプログラムで確認する必要がある場合は、HandlerInterceptor
インターフェイスを実装し、preHandle メソッドで呼び出しSecurityContextHolder.getContext().getAuthentication()
て現在のユーザーを取得します。その後、ユーザーの権限を確認できます。
インターセプターは次のように構成されます。
<mvc:interceptors>
<bean class="com.my.package.MyInterceptor" />
</mvc:interceptors>
intercept-url
必要な役割を持つ要素を構成に追加します。
<http auto-config='true'>
<intercept-url pattern="/**" access="ROLE_FOO" />
</http>
HandlerMethodArgumentResolverを使用して、Spring がコントローラー メソッドに GrantedAuthority を注入できるようにします。ユーザーが複数の権限を持つことができる場合、ユーザーの権限を保持するためのクラスを作成する必要があります (名前を として付けることができますGrantedAuthorities
)。完了すると、コントローラー メソッドは次のようになります。
@RequestMapping({"/xyz"})
public String handleXYZRequest(GrantedAuthorities authorities) {
/* use authorities if not null */
...
}
リゾルバーでは、権限を取得するために現在使用しているのと同じコードを使用し、null またはGrantedAuthorities
オブジェクトのいずれかを返します。古いバージョンの Spring を使用している場合は、それを使用WebArgumentResolver
して AnnotationMethodHandlerAdapter に登録します。
SecurityContextHolder
上記のアプローチはコードの重複を回避し、コントローラーメソッドで必要なものを挿入するために使用できます。
編集
これは、温室で使用されるアプローチに似ています。プリンシパル ( Account オブジェクト) が引数リゾルバーを介してコントローラーに挿入されるWebConfigを参照してください。