Правило antMatcher Spring Security на основе пользовательских заголовков - PullRequest
1 голос
/ 04 июля 2019

В рамках Spring я в настоящее время пытаюсь использовать пользовательские заголовки, а не URL, чтобы различать некоторые конечные точки. В настоящий момент я не могу понять, как разрешить определенный URL с настраиваемым заголовком, но запретить другой в Spring Security. Моя конфигурация безопасности в настоящее время имеет antMatcher, который выглядит следующим образом:

.antMatchers( HttpMethod.POST, "/api/website-user" ).permitAll()

Однако у меня есть несколько других методов 'POST', которые также защищены - для этой конкретной конечной точки я хочу, чтобы она была идентифицирована и исключена только через отправленные заголовки.

Как вы узнали о том, что Spring Security сообщил, что этот URL-адрес должен пройти через не прошедший проверку подлинности

 @PostMapping( headers = "X-Operation-Name=forgot-password" )
   public WebsiteUser forgotPassword( @Valid PasswordResetRequestModel passwordReset )

но этот, например, не (и полагается на аутентифицированного пользователя)?

@PostMapping( headers = "X-Operation-Name=resend-verification" )
   public WebsiteUser resendVerification( Principal principal )

1 Ответ

2 голосов
/ 04 июля 2019

Вы всегда можете реализовать RequestMatcher для определения своей настроенной логики соответствия HTTP-запросов.Если сопоставитель возвращает true для HTTP-запроса, он разрешит этому запросу доступ:

public MyRequestMatcher implements RequestMatcher {

    boolean matches(HttpServletRequest request){
         //Define the matching logic here....
         if(request.getHeader("xxx") != null &&
            request.getHeader("xxx").equals("yyyy"){
             return true;
         }
         //blablablab
    }
} 

и настроить для использования этого сопоставителя:

 httpSecurity.authorizeRequests().requestMatchers(new MyRequestMatcher()).permitAll();

Spring Security также предоставляет некоторые общиеRequestMatcher, например RequestHeaderRequestMatcher и AndRequestMatcher, которые должны соответствовать вашим потребностям:

//This matches if the request has X-Operation-Name header and its value is forgot-password
RequestHeaderRequestMatcher headerMatcher = new RequestHeaderRequestMatcher("X-Operation-Name","forgot-password" );

// This matches if the request is POST to the /api/website-user
AntPathRequestMatcher antRequestMatcher = new AntPathRequestMatcher("/api/website-user", HttpMethod.POST)

// This matches if both of the above matches matches 
AndRequestMatcher andMatcher = new AndRequestMatcher(headerMatcher,antRequestMatcher );

httpSecurity.authorizeRequests().requestMatchers(andMatcher).permitAll();
...