web-dev-qa-db-ja.com

スコープに基づいて@PreAuthorizeを使用してspring-security-oauthリソースを保護する方法は?

外部アプリがアプリケーションで認証できるように、spring-security-oauth2を正常に構成しました。ただし、外部アプリとユーザーの許可に基づいて、クライアントはAPIのサブセットにのみアクセスできるようにする必要があります。使用可能なサブセットは、OAuthスコープによって決定されます。

従来のSpringアプリケーションでは、@ PreAuthorizeを使用して、ロールに基づいて境界を適用できました。

@Controller
public class MyController {
  @PreAuthorize("hasRole('admin')")
  @RequestMapping("...")
  public String doStuff() {
    // ...
  }
}

OAuthを使用し、ロールの代わりにスコープを使用する場合、同じことを行うにはどうすればよいですか?

8
yankee

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を確認してください。

欠点は、OAuth2MethodSecurityExpressionHandlerDefaultMethodSecurityExpressionHandlerを拡張するため、このクラスを拡張する他のクラスと組み合わせることができないことです。

別の方法として、 map OAuthスコープを従来のユーザーロールに

17
yankee