Угловой интерфейс с Spring Boot Security и Keycloak - PullRequest
0 голосов
/ 03 января 2019

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

Идея довольно проста: создать угловой интерфейс с защищенным бэкэндом Spring Boot, используя Keycloak в качестве индивидуальностиПоставщик.

Внешний интерфейс:

Для внешнего интерфейса я обнаружил, что один: https://www.npmjs.com/package/keycloak-angular, который хорошо работает для внешнего интерфейса.Я захожу на страницу, получаю перенаправление на страницу входа в keycloak и получаю пакет с токеном JWT в моих карманах.

В Keycloak я настроил клиент с протоколом 'openid-connect' и типом доступа 'public'

Backend:

Для Backend я пытаюсьиспользование Spring Boot в качестве сервера ресурсов добавило эти зависимости в мою сборку сборки:

implementation("org.springframework.security:spring-security-oauth2-jose")
implementation("org.springframework.security.oauth:spring-security-oauth2:2.3.4.RELEASE")
implementation("org.springframework.security:spring-security-oauth2-resource-server")

имел такую ​​конфигурацию безопасности:

private val AUTH_WHITELIST: Array<String> = arrayOf(
        // -- swagger ui
        "/v2/api-docs", "/swagger-resources",
        "/swagger-resources/**", "/configuration/ui",
        "/configuration/security",
        "/swagger-ui.html",
        "/webjars/**"
)


@Throws(Exception::class)
override fun configure(http: HttpSecurity) {
    http.cors()
            .and().authorizeRequests()
            .antMatchers(*AUTH_WHITELIST).permitAll()
            .anyRequest().authenticated()
            .and().logout().logoutUrl("/logout").permitAll()
            .and().csrf().disable()
            .oauth2ResourceServer().jwt().jwkSetUri(this.authProperties.jwt.jwkSetUri);
    // .and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
}

и добавил следующие свойства в application.yml

  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: http://localhost:8081/auth/realms/{{realm}}/protocol/openid-connect/certs
          issuer-uri: http://localhost:8081/auth/realms/{{realm}}

В Keycloak я также создал клиента с протоколом 'openid-connect' и типом доступа 'только для канала'

. Для тестирования бэкэнда я использую swagger и поэтому создаю другого клиента.в протоколе keycloak 'openid-connect' и типе доступа 'public' и следовал этим инструкциям: Интеграция Keycloak в Swagger , которая также очень хорошо работает.

Frontend + Backend:

Теперь я пытаюсь собрать вещи вместе.Я создаю сервис во внешнем интерфейсе, вызывающий REST API.Я вижу, что CORS работает (OPTION Call сначала возвращает 200) Затем GET возвращает 401 даже с установленным заголовком авторизации:

Authorization       bearer eyJhbGciOiJSUzI1NiIsInR…hz0zWAU3hFQR87stc8alj9asJqZPw

После настройки журнала безопасности для отладки он говорит что-то вроде

2019-01-03 14: 30: 58.183 DEBUG 17884 --- [nio-8080-exec-3] osswaAnonymousAuthenticationFilter: заполняет SecurityContextHolder анонимным токеном: 'org.springframework.security.authentication.AnonymousAuthenticationToken@355bb1;Полномочия: [ЗАЩИЩЕНО];Аутентифицировано: правда;Подробности: org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 127.0.0.1;SessionId: null;Предоставленные полномочия: ROLE_ANONYMOUS '

Теперь я понятия не имею, что делать.Может быть, кто-нибудь может помочь.Thx

...