Различные конечные точки авторизуются на первый взгляд случайным образом - PullRequest
0 голосов
/ 18 января 2019

Я пишу приложение, в котором я пытаюсь настроить видимость различных конечных точек.

Я написал следующий код:

@Override
   protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable().authorizeRequests()
        .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
        .antMatchers(HttpMethod.POST, "/login").permitAll()
        .antMatchers(HttpMethod.GET, "/login").permitAll()
        .antMatchers(HttpMethod.GET, "/").authenticated()
        .antMatchers(HttpMethod.GET, UPVOTE_URL).authenticated()
        .antMatchers(HttpMethod.GET, DOWNVOTE_URL).authenticated()
        .antMatchers(HttpMethod.POST, LOG_OUT_URL).authenticated()
        .antMatchers(HttpMethod.DELETE, DELETE_URL).authenticated()
        .antMatchers(HttpMethod.POST, ADD_URL).authenticated()
        .anyRequest().authenticated()
        .and()
        .addFilter(new JWTAuthenticationFilter(authenticationManager()))
        .addFilter(new JWTAuthorizationFilter(authenticationManager()))      
     .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .logout()
        .and()
        .exceptionHandling()
        .authenticationEntryPoint(new Http401AuthenticationEntryPoint("No authorization"));

Поведение моей программы довольно странное, потому что программа иногда возвращает 401, когда я пытаюсь достичь конечных точек "/ login" или "/" (которые afaik должен перенаправить на страницу входа, если пользователь не подписан в).

После этого я перезапускаю его, возможно, с некоторыми незначительными изменениями где-то еще, которые, казалось бы, совершенно не имеют значения, и мой веб-сайт снова работает.

Кто-нибудь из вас встречался с такими проблемами? Каковы причины этого? Я сделал что-то не так в конфигурации?

1 Ответ

0 голосов
/ 18 января 2019

Три вещи, которые выделяются здесь

  1. У вас есть пользовательская точка входа, и считается, что точка входа отправляет 401 вместо перенаправления на / login

  2. у вас нет formLogin(), поэтому фильтр, обрабатывающий страницу входа, не воспроизводится

  3. Мы не знаем, что и когда делают ваши фильтры

Что касается конфигурации, давайте начнем сначала

    http
        .cors()
            .and()
        .csrf()
            .disable()
        .authorizeRequests()
            .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
            .antMatchers("/login").permitAll()
            .antMatchers(HttpMethod.GET, "/").authenticated()
            .antMatchers(HttpMethod.GET, UPVOTE_URL).authenticated()
            .antMatchers(HttpMethod.GET, DOWNVOTE_URL).authenticated()
            .antMatchers(HttpMethod.POST, LOG_OUT_URL).authenticated()
            .antMatchers(HttpMethod.DELETE, DELETE_URL).authenticated()
            .antMatchers(HttpMethod.POST, ADD_URL).authenticated()
            .anyRequest().authenticated()
            .and()
        .addFilterBefore(new JWTAuthenticationFilter(authenticationManager()), HeaderWriterFilter.class)
        .addFilterAfter(new JWTAuthorizationFilter(authenticationManager()), JWTAuthenticationFilter.class)
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .formLogin()
            .and()
        .logout()
        ;

Так что же мы изменили,

  1. удалить точку входа аутентификации и переместить фильтры JWT вперед. Если эти фильтры срабатывают (и они НЕ должны сработать для конечной точки, отличной от REST, поэтому вы должны написать эту логику), то система либо аутентифицируется, либо сами фильтры возвращают 401 и не выдают исключение. Может быть, вы можете сообщить нам, действительно ли эти фильтры работают правильно?

  2. Если фильтры JWT ничего не делают, все остальное входит в игру. Поэтому мы добавили в formLogin () все настройки по умолчанию. Если точка входа аутентификации вызывается, потому что запрос не аутентифицирован, когда это должно быть, произойдет перенаправление на / login

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...