外部アプリがアプリケーションで認証できるように、spring-security-oauth2を正常に構成しました。ただし、外部アプリとユーザーの許可に基づいて、クライアントはAPIのサブセットにのみアクセスできるようにする必要があります。使用可能なサブセットは、OAuthスコープによって決定されます。
従来のSpringアプリケーションでは、@ PreAuthorizeを使用して、ロールに基づいて境界を適用できました。
@Controller
public class MyController {
@PreAuthorize("hasRole('admin')")
@RequestMapping("...")
public String doStuff() {
// ...
}
}
OAuthを使用し、ロールの代わりにスコープを使用する場合、同じことを行うにはどうすればよいですか?
Spring OAuthはOAuth2MethodSecurityExpressionHandler
に同梱されています。これは、@ PreAuthorize式を使用してこのようなチェックを行う機能を追加するクラスです。必要なのはこのクラスを登録することだけです。 Javaconfigを使用しています:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public static class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
return new OAuth2MethodSecurityExpressionHandler();
}
}
今、あなたは単に使うことができます:
@PreAuthorize("#oauth2.hasScope('requiredScope')")
リクエストメソッドを保護します。 hasScope
以外に使用できるメソッドを確認するには、クラスOAuth2SecurityExpressionMethods
を確認してください。
欠点は、OAuth2MethodSecurityExpressionHandler
がDefaultMethodSecurityExpressionHandler
を拡張するため、このクラスを拡張する他のクラスと組み合わせることができないことです。
別の方法として、 map OAuthスコープを従来のユーザーロールに 。