春のセキュリティカスタム着陸権の確認

:で再現https://www.jianshu.com/p/6b8fb59b614b

プロジェクト

春のクラウドベースのプロジェクト、春の雲は、書き込みに従っ春ブートの方法で、そこで春ブーツの上に構築されています

春のセキュリティ設定

継承  WebSecurityConfigurerAdapter 、書き換えconfigure(HttpSecurity http)の設定書き換えインターセプタ、関連する権利

     http.authorizeRequests()
        .antMatchers( "/ AUTH / **" ).permitAll()
        認証.anyRequest()()および()
        // 証明書自動着陸 
        .addFilterBefore(authTokenFilter、UsernamePasswordAuthenticationFilter。クラス// ログインと権限がフィルターを制御する
        ......
    ;

カスタムUsernamePasswordAuthenticationFilter

カスタムUsernamePasswordAuthenticationFilter自動着陸の
作成認証シミュレート着陸

認証認証= 新しいUsernamePasswordAuthenticationToken(認証トークン)。
SecurityContextHolder.getContext()。setAuthentication(認証);;

カスタムFilterSecurityInterceptor

春のセキュリティは、このフィルタのHttpリソースのセキュリティフィルタリングによって達成されます。

リソースへのアクセス権限

FilterSecurityInterceptorは、ソースコードはコードbeforeInvocation方法であることを特徴とする請求AbstractSecurityInterceptor、から継承されました。

コレクション<ConfigAttribute>属性= この.obtainSecurityMetadataSource()
                .getAttributes(オブジェクト)。
この方法では、上書きすることができ、リソースのアクセス権を取得するために使用される SecurityMetadataSource obtainSecurityMetadataSource(){} FilterInvocationオブジェクトを渡して、達成するための方法を、およびコレクション<ConfigAttribute>オブジェクトを返します。
このオブジェクトは、要求、応答、および組み込みオブジェクト他に取得することができ、あなたは試合にコードを見ることができます
RequestMatcher requestMatcher =  AntPathRequestMatcher( "/マネージャー/ **" );
もし(requestMatcher.matches(リクエスト)){
     戻りRESOURCE            
}

ConfigAttributeは新しいSecurityConfig((String)を入力)によって作成することができます

書かれた認証プロバイダ

AuthenticationManagerの実装を書き換え、ユーザログインは内部にそれを置くことができます

認証認証(認証認証)が
             スロー含むAuthenticationExceptionを。

以下のように設定され、元の直接注入するのに十分な場合は、認証を生成するために使用されます。

ユーザーがリソースへのアクセス許可を持っているかどうか

ユーザーがリソースへのアクセス権を持っているかどうかを決定するどのような方法でAbstructSecurityIntercepter

この .accessDecisionManager.decide(認証された、オブジェクト、属性);

カスタムコントロールの目的のために、我々は、このメソッドをオーバーライドするAccessDecisionManagerインターフェイスを実装する必要があり、裁判官はアクセスできないようにする方法によって決定していない場合、あなたはAccessDeniedExceptionを投げることができます

/ **
 *ユーザーがリソースにアクセスする権限を持っているかどうかを確認
 * @Param 認証ユーザー認証
 * @Param オブジェクトオブジェクトのFilterInvocation
 * @Param ConfigAttributesリソースが権限を必要と
 * @throws AccessDeniedException無権限例外
 * @throws InsufficientAuthenticationException
  * / 
公共 ボイドは、(認証、認証、Objectオブジェクトを決めます
                       コレクションは、 <ConfigAttribute> configAttributes)
             スローAccessDeniedException、InsufficientAuthenticationException {
                 場合(アクセス){
                     // 允许通过
                    リターンを
                }
                // の役割へのアクセスを許可していない
                スロー 新しい新しい AccessDeniedExceptionを(「NO許可」)。
            }

JAVAソースピース

WebSecurityConfig

@Configuration
 パブリック クラス WebSecurityConfigは延びWebSecurityConfigurerAdapterを{
    @Autowired
    プライベートAuthTokenFilter authTokenFilter。   
    @Autowired
    プライベートApiPermissionSecurityFilter securityFilter。
    保護された 無効 configureは(HttpSecurity HTTP)スロー例外を{
        http.authorizeRequests()
            .antMatchers( "/ AUTH / **" ).permitAll()
            認証.anyRequest()()および()
            // 証明書自動着陸 
            .addFilterBefore(authTokenFilter、UsernamePasswordAuthenticationFilter。クラス// ログインと権限がフィルター制御 
            .addFilterBefore(SecurityFilter、FilterSecurityInterceptor。クラス
            .csrf()。無効()
            // ベースのトークンは、セッションを必要としない
            .sessionManagement()。SessionCreationPolicy(SessionCreationPolicy.STATELESSを)
        ;
    }
}

AuthTokenFilter(カスタムUsernamePasswordAuthenticationFilter)

@Component
 パブリック クラス AuthTokenFilterは延び{OncePerRequestFilter
    @オーバーライド
        保護された ボイド doFilterInternal(HttpServletRequestのリクエスト、HttpServletResponseの応答、フィルターチェーンれるFilterChain)スローServletExceptionが、IOExceptionが{
            認証文字列 = request.getHeader(「認可」);
             // ユーザのログイン、彼らは設定しません権限 
            トークントークン= 新しい新しいトークン(認証、ヌル);
            認証認証 = 新しいUsernamePasswordAuthenticationToken(認証トークン)。
            SecurityContextHolder.getContext()setAuthentication(認証)。
            filterChain.doFilter(リクエスト、レスポンス)。
        }
}

ApiPermissionSecurityFilter

@Component
 パブリック クラス ApiPermissionSecurityFilterは延び AbstractSecurityInterceptor 実装{フィルター
    @Autowired
    プライベートApiInvocationSecurityMetadataSourceServiceのapiInvocationSecurityMetadataSourceService。
    @Autowired
    プライベートApiAccessDecisionManager apiAccessDecisionManager。
    @Autowired
    プライベートAuthenticationManager authenticationManager。

    @PostConstruct
    公共 のinit(){
         スーパー.setAuthenticationManager(authenticationManager)。
        スーパー.setAccessDecisionManager(apiAccessDecisionManager)。
    }
    
    公共 ボイドのdoFilter(のServletRequest要求たServletResponse応答れるFilterChain鎖)
             スローにIOException、ServletExceptionがを{
        FilterInvocation Fiを = 新しいFilterInvocation(リクエスト、レスポンス、鎖);
        (FI)を呼び出します。
    }

    パブリッククラス<?延び OBJECT> getSecureObjectClass(){
         戻り FilterInvocationを。クラス
    }

    公共 ボイド呼び出し(FilterInvocation fiは)スローにIOException、ServletExceptionがを{
        InterceptorStatusTokenトークン = スーパー.beforeInvocation(FI)。
        してみてください{
            。fi.getChain()のdoFilter(fi.getRequest()、fi.getResponse())。
        } 最後に{
             スーパー .afterInvocation(トークン、NULL );
        }
    }


    @オーバーライド
    公共SecurityMetadataSource obtainSecurityMetadataSource(){
         戻り 、この.apiInvocationSecurityMetadataSourceServiceと、
    }
    公共の 無効(破棄){
    }
    公共 ボイドのinit(に、FilterConfigに、FilterConfig)がスローServletExceptionがを{
    }
}

ApiInvocationSecurityMetadataSourceService

/ **
 *リソース - アクセスコントロールオブジェクト
 * 2017年3月17日に梁によって作成されました。
 * /
@成分
パブリック クラス ApiInvocationSecurityMetadataSourceServiceの実装
        FilterInvocationSecurityMetadataSource {
    // キャッシュ英語-許可
    プライベート 静的 LoadingCache <文字列、コレクション<ConfigAttribute >> permitMap = ヌル;
     // キャッシュ英語-ODCINFO情報オブジェクト
    プライベート 静的 LoadingCache <文字列、OdcInfo> odcInfoMap = nullを
    @PostConstruct
    プライベート のボイドのinit(){
         // リソースを初期化リソースとロール権限を開始
         // キャッシュ英語-許可の初期化
         // キャッシュ英語-ODCINFO 
    }
    
    @オーバーライド
    パブリックコレクション<ConfigAttribute>のgetAttributes(Objectオブジェクト)がスロー、IllegalArgumentExceptionを{
        FilterInvocation FilterInvocation = (FilterInvocation)オブジェクト;
         // あなたがやりたいことをやってTODOは、以下のパスをするためのリソースを持ってもらうことです
        戻るpermitMap.get(getHttpRequest()getRequestURIを());
    }

    @オーバーライド
    パブリックコレクション<ConfigAttribute> getAllConfigAttributes(){
         リターン 新しいのArrayList <ConfigAttribute> ();
    }

    @オーバーライド
    パブリック ブールサポート(<?>クラスAClassは){
         // 非常に重要な、そうでない場合は無効と
        リターン をtrueに
    }
}

ApiAccessDecisionManager

@Component
 パブリック クラス ApiAccessDecisionManagerの実装AccessDecisionManager {
     / **
     *ユーザーがリソースにアクセスする権限を持っているかどうかを確認
     * @Param 認証ユーザー認証
     * @Param オブジェクトオブジェクトのFilterInvocation
     * @Param ConfigAttributesリソースが権限を必要と
     * @throws AccessDeniedException无权限例外
      * / 
    公共 ボイドが、(認証、認証、Objectオブジェクトを決めます
               コレクション <ConfigAttribute> configAttributes)は
                スローAccessDeniedException {
         場合(アクセス){
             // 允许通过
            リターンを
        }
        // の役割へのアクセスを許可していない
        スロー 新しい新しい AccessDeniedExceptionを(「NO許可」)。
    }
    
    パブリック ブールサポート(ConfigAttribute属性){
             返す 
    }

    パブリック ブールサポート(クラス<?> clazz){
         返す 
    }
}

 






著者:libertinus
リンクします。https://www.jianshu.com/p/6b8fb59b614b
出典:ジェーンの本が
著者によって著作権で保護されています。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

おすすめ

転載: www.cnblogs.com/it-deepinmind/p/12074685.html