Как аутентифицировать запросы Jquery ajax с помощью Keycloack,

У меня есть приложение весенней загрузки (mvc), которое защищается с помощью keycloack. (используя с spring-boot-starter-security и keycloak-spring-boot-starter)

Я настроил KeycloakWebSecurityConfigurerAdapter таким образом;

    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    @Override
    protected KeycloakAuthenticationProvider keycloakAuthenticationProvider() {
        return this.tybsKimlikSaglayici;
    }

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

        http.cors().and().authorizeRequests().antMatchers("/", 
                "/home").permitAll().antMatchers("/admin").permitAll()
                .anyRequest().authenticated().and()
                .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/sso/logout")).permitAll();

        http.exceptionHandling().accessDeniedPage("accessDeniedPage");
    }

  @Bean 
        public CorsConfigurationSource corsConfigurationSource() {
            final CorsConfiguration configuration = new CorsConfiguration();
            configuration.setAllowedOrigins(ImmutableList.of("*"));
            configuration.setAllowedMethods(ImmutableList.of("HEAD",
                    "GET", "POST", "PUT", "DELETE", "PATCH"));

            configuration.setAllowCredentials(true);

            configuration.setAllowedHeaders(ImmutableList.of("Authorization", "Cache-Control", "Content-Type"));
            final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            source.registerCorsConfiguration("/**", configuration);
            return source;
        }

Запрос к методу контроллера, ответ на который HTML-представление работает нормально (keycloack аутентифицирует запрос)

но действие формы для метода контроллера Ajax-запрос к методу контроллера rest не работает (запросы публикации, размещения, удаления ..)

Я добавил @CrossOrigin(origins = "*") в свой контроллер.

Вот мой запрос ajax,

$.ajax({
    type : "method_here",
    contentType : "application/json; charset=utf-8;",
    url : "url_here",
    data : JSON.stringify(data),
    timeout : 30000, 
    success : function(response) {

    },
    error : function(error) {

    }
});

вот клиент keycloack

введите здесь описание изображения

вот kecloack json (я пробовал файл application.properties)

{
  "realm": "demo-realm",
  "auth-server-url": "url_of_sso_app",
  "ssl-required": "external",
  "resource": "kie-remote",
  "principal-attribute": "preferred_username",
  #"enable-cors": true,     **tryed to add**
  #"cors-max-age" : 10000,   
  #"cors-allowed-methods": "GET, POST, PUT, HEAD, OPTIONS", 
  #"cors-allowed-headers": "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headersl", 
  "credentials": {
     "secret": "secret_of_realm_client"
  }
}

как я могу решить эту проблему. Как я могу аутентифицировать запрос ajax с помощью keycloack.


person Batuhan    schedule 05.11.2017    source источник
comment
Можно, пожалуйста, подробнее, что не работает. Каков результат запросов AJAX?   -  person Boomer    schedule 06.11.2017
comment
В консоли eclipse было показано сообщение 403, не отображающее сообщение, но ответ об ошибке ajax показывает, что 404 не найдено. Спасибо за внимание, я решил проблему. я добавил к ответам   -  person Batuhan    schedule 06.11.2017


Ответы (1)


я нашел свою пропажу.

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring()
                  .antMatchers(HttpMethod.POST, "/**")
                  .antMatchers(HttpMethod.PUT, "/**")
                  .antMatchers(HttpMethod.DELETE, "/**");
}

этот метод должен быть переопределен в конфигурации веб-безопасности. И это должно быть изменено как .antMatchers(HttpMethod.POST, "/allowed_method_path")

Изменить:

Этот код игнорирует процесс аутентификации для этих типов методов http. Правильное решение не использует метод web.ignoring(). Проблема связана с csrf (параметр безопасности Spring по умолчанию для csrf включен) spring запрещает помещать, удалять, публиковать методы http для защиты сервера от атак csrf. Если служба не использует браузер, csrf можно отключить, но служба создает страницу браузера, решение состоит в том, чтобы настроить csrf. Пожалуйста, проверьте Как получить csrf токен в макросе скорости при использовании Spring Security

Спасибо

person Batuhan    schedule 06.11.2017