0

У меня есть сервер авторизации и ресурсов, которые работают в одном приложении. Настройка работает нормально с пружинным ботинком 1.2.6.RELEASE и пружинной защитой oauth2 2.0.7.RELEASE. После обновления весенней загрузки 1.3.0.RELEASE (независимо от того, была ли пружинная защита oauth2 2.0.7.RELEASE или 2.0.8.RELEASE) /login конечная точка для ОТЧЕТ ОШИБКИ. Я получил ответ 405 «Метод не разрешен».405: Метод не разрешен после обновления Spring Boot 1.3.0

Я провел целый день без успеха. Я также настраиваю дополнительный, простой сервер авторизации и ресурсов, который работает в одном приложении. Однако эта легкая установка имеет ту же проблему. Как только я включаю сервер ресурсов, конечная точка входа больше не работает.

Ниже приведены фрагменты конфигурации моего исходного сервера.

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    // ... some code 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http 
       .authorizeRequests() 
       .anyRequest().authenticated() 
       .and() 
       .csrf() 
       .requireCsrfProtectionMatcher(new AntPathRequestMatcher("/oauth/authorize")) 
       .disable() 
       .logout() 
       .logoutUrl(logoutUrl) 
       .logoutSuccessHandler(logoutSuccessHandler) 
       .invalidateHttpSession(true) 
       .and() 
       .formLogin() 
       .permitAll() 
       .loginProcessingUrl(loginProcessingUrl) 
       .failureUrl(loginAuthenticationFailureUrl) 
       .loginPage(loginPage); 
    } 

} 

@Configuration 
@EnableResourceServer 
public class ResourceServerConfig extends ResourceServerConfigurerAdapter { 

    // ... some code 

    private static final String RESOURCE_SERVER_MAPPING_REGEX = "^(?!(\\/?login|\\/?logout|\\/?oauth)).*$"; 

    // ...some code 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 

     http 
      // Configure the endpoints wherefore the resource server is responsible or rather should bound to. 
      .requestMatchers().regexMatchers(RESOURCE_SERVER_MAPPING_REGEX) 
      .and() 
      .authorizeRequests().anyRequest().permitAll() 
      .and() 
      .headers().frameOptions().disable(); 
    } 
} 

ответ

0

Это должно быть довольно простым.

Запросы POST и PUT не разрешены, если включен CSRF, а весенняя загрузка позволяет по умолчанию.

Просто добавьте в код конфигурации ResourceServerConfig:

.csrf().disable() 

Это также рассматривается в качестве примера проблемы here

+0

Вы имеете в виду, даже для resourceserverconfig? Как в выше него нет, что .. –

+0

Извините за причиненные путаницы. Вы правы, конфигурация ResourceServer не содержит конфигурацию. Однако я пробовал это без успеха. Я не уверен в этом порядке или, скорее, в использовании нескольких конфигураций HttpSecurity. Может быть, для CSRF не имеет значения, в какой объект HttpSecurity он настроен. – GeBeater

2

Решение

Похоже, что я столкнулся с проблемой упомянутый в @EnableResourceServer creates a FilterChain that matches possible unwanted endpoints with Spring Security 4.0.3 Spring Security - это зависимость от весенней загрузки-стартера. Из-за обновления родительского родителя-стартера я переключился с Spring Security 3.2.8 на 4.0.3. Еще один интересный комментарий по этому вопросу можно найти here.

Я изменил конфигурацию ResourceServer, как приведенные ниже фрагменты кода, которые разрешают проблему.

Было бы здорово заменить определение RegexRequestMatcher, используя отрицание уже существующего кода, чтобы соответствовать форме входа и выхода из системы, или Matches, как Spring NotOAuthRequestMatcher, который в настоящее время является частным внутренним классом ResourceServerConfiguration. Пожалуйста, не стесняйтесь предлагать предложения. ;-)

@Configuration 
@EnableResourceServer 
public class ResourceServerConfig extends ResourceServerConfigurerAdapter { 

    // ... some code 

    private static final String RESOURCE_SERVER_MAPPING_REGEX = "^(?!(\\/?login|\\/?logout|\\/?oauth)).*$"; 

    // ...some code 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 

     http.requestMatcher(
       new AndRequestMatcher(
         new RegexRequestMatcher(RESOURCE_SERVER_MAPPING_REGEX, null) 
       ) 
     ).authorizeRequests().anyRequest().permitAll() 
     // ...some code 
    } 

}