-1

私は春のセキュリティで保護されたRESTエンドポイントを公開する春のブートアプリケーションを持っています。スプリングセキュリティ:サービスコールに応じてアクセスを提供

私は、サービスコールに応じて、いくつかのパスへのアクセスを制限する必要があります。のは、私はこのようなサービスがあるとしましょう:

@Service 
public class AccessService { 
    boolean hasAccess(String requestedPath) { 
     // some business logic here 
    } 
} 

サービスは、いくつかのビジネスの状況、ユーザーの役割を確認し、trueまたはfalseを返します。

このサービスコールをセキュリティ設定に統合する必要があります。私はここに(それは完全に静的であるとして)サービスコールを追加する手立てを見ない

@Override 
protected void configure(HttpSecurity http) throws Exception { 
     http 
       ... 
       .and().authorizeRequests() 
       .anyRequest().hasRole("USER"); 
} 

これまでのところ、私はこのような構成を有しています。

現在、私は私のAuthenticationProviderをオーバーライドすることを考えや追加機能とそれを拡張しています:私は何をしようとしている

他のオプションは、承認のいくつかの並べ替えを行うだろうクラスから私のRESTコントローラを拡張するだろうが、私はそれが可能であるかはわかりません。

質問:サービスメソッド呼び出しに基づいてRESTエンドポイントを保護するにはどうすればよいですか?それを行う正しい方法は何ですか?

+1

Iは、[リファレンスガイド](https://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html#el-access-web)の読み出しを示唆しています。 'anyRequest()。access(" @ accessService.hasAccess(request.requestURI)&& hasRole( 'USER') ");'のようなものは、 –

答えて

1

これはthe reference guideで説明されています。基本的にhasRoleの代わりにaccessという式を使用する必要があります。強力なセキュリティ式を記述できます。

anyRequest() 
    .access("@accessService.hasAccess(request.reques‌​tURI) && hasRole('USER')"); 

これが役割ROLE_USERとその独自のカスタム・ロジックに応じてアクセス権を持っていると、ユーザーへのアクセスを制限します。以下のような

何かがトリックを行う必要があります。

1

私はこれを行う良い方法は使用することだと考えています@PreAuthorize ここにあるドキュメントはExpression-Based Access Controlです。
また、あなたの特定のニーズにカスタマイズするために、独自の評価クラス/メソッドを追加することができます: @PreAuthorize("@customPermissionEvaluator.accessMethod(variable)")

例クラス:

@Service(value = "customPermissionEvaluator") 
public class CustomPermissionEvaluatorImpl implements CustomPermissionEvaluator { 
    @Override 
    public boolean accessMethod(int variable) {  
     if (variable == 1) { 
      return true; 
     }  
     return false; 
    } 
} 
関連する問題