permitAll()と期限切れの認証トークンを使用したURLのSpring Security

Alexander Burakevych

Spring Security、カスタムGenericFilterBean、AuthenticationProvider実装を備えたSpring4を使用しています。新しいセッションを作成するためのURLを除いて、ほとんどの場合URLを保護しています:/ v2 / session(たとえば、ユーザー名とパスワードに基づいてログインし、認証を必要とする後続のリクエストで使用される認証トークンを返します):次のように構成されています。

@Configuration
@ComponentScan(basePackages={"com.api.security"})
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private ApiAuthenticationProvider apiAuthenticationProvider;

@Autowired
private AuthTokenHeaderAuthenticationFilter authTokenHeaderAuthenticationFilter;

@Autowired
private AuthenticationEntryPoint apiAuthenticationEntryPoint;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
    auth.authenticationProvider(apiAuthenticationProvider);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .addFilterBefore(authTokenHeaderAuthenticationFilter, BasicAuthenticationFilter.class) // Main auth filter
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

    http.authorizeRequests()
        .antMatchers(HttpMethod.POST, "/v2/session").permitAll()
        .anyRequest().authenticated();

    http.exceptionHandling()
        .authenticationEntryPoint(apiAuthenticationEntryPoint);
}
}

authTokenHeaderAuthenticationFilterは、すべてのリクエストに応じて実行され、リクエストヘッダからトークンを取得します。

/**
 * Main Auth Filter. Always sets Security Context if the Auth token Header is not empty
 */
@Component
public class AuthTokenHeaderAuthenticationFilter extends GenericFilterBean {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    final String token = ((HttpServletRequest) request).getHeader(RequestHeaders.AUTH_TOKEN_HEADER);
    if (StringUtils.isEmpty(token)) {
        chain.doFilter(request, response);
        return;
    }

    try {
            AuthenticationToken authRequest = new AuthenticationToken(token);

              SecurityContextHolder.getContext().setAuthentication(authRequest);
        }
    } catch (AuthenticationException failed) {
        SecurityContextHolder.clearContext();

        return;
    }

    chain.doFilter(request, response); // continue down the chain
}

}

カスタムapiAuthenticationProviderは、ヘッダーで提供されたトークンに基づいてすべての要求を認証しようとします。認証が失敗した場合、AccessExceptionをスローし、クライアントはHTTP401応答を受信します。

@Component
public class ApiAuthenticationProvider implements AuthenticationProvider {

@Autowired
private remoteAuthService remoteAuthService;

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {

    AuthenticationToken authRequest = (AuthenticationToken) authentication;
    String identity = null;

    try {
        identity = remoteAuthService.getUserIdentityFromToken(authRequest.getToken());
    } catch (AccessException e) {
        throw new InvalidAuthTokenException("Cannot get user identity from the token", e);
    }

    return new AuthenticationToken(identity, authRequest.getToken(), getGrantedAuthorites());
    }
    }

これは、認証を必要とする要求に対しては完全に正常に機能します。これは、認証ヘッダーが含まれていない/ v2 / sessionリクエストに対しては正常に機能します。ただし、ヘッダー(またはCookie内-コードサンプルには表示されていません。クライアントがヘッダーをクリアしなかった場合、またはリクエストとともにCookieを送信し続けた場合)に期限切れの認証トークンがある/ v2 / sessionリクエストの場合)セキュリティコンテキストが初期化され、apiAuthenticationProviderが例外をスローし、HTTP401でクライアントに応答します。

以来/ V2 /セッションがように構成されています

http.authorizeRequests()
        .antMatchers(HttpMethod.POST, "/v2/session").permitAll()

Spring Securityは、ApiAuthenticationProvider.authenticate()を呼び出す前にそれを判断することを期待しています。フィルタまたは認証プロバイダーがpermitAll()として構成されたURLの例外を無視する/スローしない方法は何ですか?

グリゴリ

Springセキュリティフィルタは、リクエストの承認チェックが実行される前にトリガーされます。承認チェックが機能するためには、要求がフィルターを通過し、Springセキュリティコンテキストが設定されている(または、認証資格情報が渡されたかどうかによっては設定されていない)と想定されます。

フィルタには、トークンがない場合にフィルタチェーン処理を続行するチェックがあります。残念ながら、そうである場合は、認証のためにプロバイダーに渡されます。トークンの有効期限が切れているため、例外がスローされ、401が取得されます。

最善の策は、公開されていると見なすURLのフィルター実行をバイパスすることです。これは、フィルター自体または構成クラスで実行できます。次のメソッドをSecurityConfigクラスに追加します

@Override
public void configure(WebSecurity webSecurity) {
  webSecurity.ignoring().antMatchers(HttpMethod.POST, "/v2/session");
}

これが行うことは、URLをAuthTokenHeaderAuthenticationFilter完全にバイパスすることですPOST /v2/sessions

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

permitAll()と期限切れの認証トークンを使用したURLのSpring Security

分類Dev

Spring Bootを使用したSpring Security:基本認証とJWTトークン認証を組み合わせる

分類Dev

Spring-Securityと基本認証を使用したRESTサービスの認証

分類Dev

Spring Security Java構成は、認証されたソースでのみ使用可能なJSPへのアクセス要求をインターセプトしません

分類Dev

Spring Security Java構成は、認証されたソースでのみ使用可能なJSPへのアクセス要求をインターセプトしません

分類Dev

Spring SecurityとMarkLogicのJavaクライアントAPIを介してユーザーを認証する方法は?

分類Dev

RestTemplateを使用したSpring Security認証

分類Dev

JHipster、Spring Security、およびoauth2を使用した認証リダイレクトの制御

分類Dev

AWS Security TokenServiceから取得したトークンを明示的に期限切れにする

分類Dev

Spring Securityは、HttpSecurityを使用してURLとメソッドのリクエストを承認します

分類Dev

Spring Security JWT更新トークンが期限切れにならない

分類Dev

期限切れの証明書がsun.security.validator.ValidatorExceptionエラーを生成することはありますか?

分類Dev

ログイン、パスワード、およびSpring Security(OAuthではない)を使用したFacebookアクセストークンを使用した認証方法

分類Dev

RequestHeaderMatcherを使用したSpring Boot Security PermitAllが機能しない

分類Dev

Spring Security OAuth2- @ EnableOauth2Ssoですが、認証としてトークンも受け入れます

分類Dev

ユーザーロールとSpring Securityを使用したURLの保護

分類Dev

Spring Securityで認証が失敗した後、元のページにリダイレクトする

分類Dev

複数の認証プロバイダーLDAP認証とJPAをサポートするSpring Security

分類Dev

Spring SecurityとLDAP認証

分類Dev

filter = "none"を使用してパブリックページでもSpring Securityの認証を取得する

分類Dev

Grails Spring Security Shiro、2つの異なる認証成功URLを使用して2つのログインフォームを作成する方法は?

分類Dev

Spring Security OAuth2は、ブラウザー(Angular)クライアント用のPKCEを使用した認証コードフローをサポートしていますか?

分類Dev

Spring SecurityのAuthenticationSuccessHandler

分類Dev

Spring Security:expired-urlにリダイレクトせずにセッションが期限切れになる

分類Dev

Spring-Security PasswordEncoderをデフォルトの認証プロバイダーで使用していますか?

分類Dev

Spring-Securityを使用したhttpドメインに基づく認証

分類Dev

APIリクエストで追加のヘッダーパラメーターを使用してOauth 2.0認証をスキップする-Spring Security

分類Dev

Spring Securityを使用したSpringMVC Websocketsメッセージングユーザー認証

分類Dev

Java SSL / TLSは期限切れの証明書を無視しますか?(java.security.cert.CertPathValidatorException:タイムスタンプチェックに失敗しました)

Related 関連記事

  1. 1

    permitAll()と期限切れの認証トークンを使用したURLのSpring Security

  2. 2

    Spring Bootを使用したSpring Security:基本認証とJWTトークン認証を組み合わせる

  3. 3

    Spring-Securityと基本認証を使用したRESTサービスの認証

  4. 4

    Spring Security Java構成は、認証されたソースでのみ使用可能なJSPへのアクセス要求をインターセプトしません

  5. 5

    Spring Security Java構成は、認証されたソースでのみ使用可能なJSPへのアクセス要求をインターセプトしません

  6. 6

    Spring SecurityとMarkLogicのJavaクライアントAPIを介してユーザーを認証する方法は?

  7. 7

    RestTemplateを使用したSpring Security認証

  8. 8

    JHipster、Spring Security、およびoauth2を使用した認証リダイレクトの制御

  9. 9

    AWS Security TokenServiceから取得したトークンを明示的に期限切れにする

  10. 10

    Spring Securityは、HttpSecurityを使用してURLとメソッドのリクエストを承認します

  11. 11

    Spring Security JWT更新トークンが期限切れにならない

  12. 12

    期限切れの証明書がsun.security.validator.ValidatorExceptionエラーを生成することはありますか?

  13. 13

    ログイン、パスワード、およびSpring Security(OAuthではない)を使用したFacebookアクセストークンを使用した認証方法

  14. 14

    RequestHeaderMatcherを使用したSpring Boot Security PermitAllが機能しない

  15. 15

    Spring Security OAuth2- @ EnableOauth2Ssoですが、認証としてトークンも受け入れます

  16. 16

    ユーザーロールとSpring Securityを使用したURLの保護

  17. 17

    Spring Securityで認証が失敗した後、元のページにリダイレクトする

  18. 18

    複数の認証プロバイダーLDAP認証とJPAをサポートするSpring Security

  19. 19

    Spring SecurityとLDAP認証

  20. 20

    filter = "none"を使用してパブリックページでもSpring Securityの認証を取得する

  21. 21

    Grails Spring Security Shiro、2つの異なる認証成功URLを使用して2つのログインフォームを作成する方法は?

  22. 22

    Spring Security OAuth2は、ブラウザー(Angular)クライアント用のPKCEを使用した認証コードフローをサポートしていますか?

  23. 23

    Spring SecurityのAuthenticationSuccessHandler

  24. 24

    Spring Security:expired-urlにリダイレクトせずにセッションが期限切れになる

  25. 25

    Spring-Security PasswordEncoderをデフォルトの認証プロバイダーで使用していますか?

  26. 26

    Spring-Securityを使用したhttpドメインに基づく認証

  27. 27

    APIリクエストで追加のヘッダーパラメーターを使用してOauth 2.0認証をスキップする-Spring Security

  28. 28

    Spring Securityを使用したSpringMVC Websocketsメッセージングユーザー認証

  29. 29

    Java SSL / TLSは期限切れの証明書を無視しますか?(java.security.cert.CertPathValidatorException:タイムスタンプチェックに失敗しました)

ホットタグ

アーカイブ