Я новичок в микросервисах и JHipster, поэтому, пожалуйста, наберитесь терпения и помогите мне в случае необходимости
У меня есть проблема с конфигурацией, но я не могу ее найти. Вот некоторые подробности:
Мы используем шлюз JHipster с Keycloak. Среда Docker compose, и, насколько я могу судить, мы выполнили необходимую работу, как указано в документации JHipster для docker.
Мы используем oauth2 в качестве типа аутентификации.
Развернутый ресурс только для отдыха. Простейший случай с двумя вызовами: / api / hello -> должен возвращать «Я говорю Hello» / free / hello -> должен возвращать «Я свободен!»
Вызов / api / hello должен быть защищен и / free / hello call явно нет.
Когда я подключаюсь к сервису / free / hello через шлюз, т.е. http://gatewayip: порт / helloapp / free / hello , я получаю ожидаемый ответ «Я свободен!»
Так что я ожидаю, что шлюз запущен и работает и маршрутизирует трафик c.
Для защищенного сервиса я использую почтальон, чтобы сначала получить токен JWT.
Когда я обращаюсь к сервису напрямую, т.е. serverip: appPort / api / hello, я получаю ожидаемый ответ
Для меня это означает, что сервис работает, и Spring Security может использовать мой токен JWT.
Теперь проблема начинается, когда я пытаюсь направить к защищенному сервису через шлюз. Я использую тот же токен через почтальона. http://gatewayip: порт / helloapp / api / hello
Теперь я получаю ответ: введите "https://www.jhipster.tech/problem/problem-with-message" title Статус "Не авторизован" 401 подробно "Полная аутентификация требуется для доступа к этому ресурсу" путь "/ api / hello" сообщение "error.http.401"
Есть ли где-нибудь FAQ или контрольный список, к которому я могу обратиться, чтобы попробовать и устранить неполадки?
Пожалуйста, дайте мне знать, какую информацию я могу добавить, чтобы помочь.
Редактировать:
SecurityConfiguration:
@EnableWebSecurity
@Import(SecurityProblemSupport.class)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Value("${spring.security.oauth2.client.provider.oidc.issuer-uri}")
private String issuerUri;
private final JHipsterProperties jHipsterProperties;
private final JwtAuthorityExtractor jwtAuthorityExtractor;
private final SecurityProblemSupport problemSupport;
public SecurityConfiguration(JwtAuthorityExtractor jwtAuthorityExtractor, JHipsterProperties jHipsterProperties, SecurityProblemSupport problemSupport) {
this.problemSupport = problemSupport;
this.jwtAuthorityExtractor = jwtAuthorityExtractor;
this.jHipsterProperties = jHipsterProperties;
}
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.csrf()
.disable()
.exceptionHandling()
.authenticationEntryPoint(problemSupport)
.accessDeniedHandler(problemSupport)
.and()
.headers()
.contentSecurityPolicy("default-src 'self'; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://storage.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:")
.and()
.referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN)
.and()
.featurePolicy("geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'")
.and()
.frameOptions()
.deny()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth-info").permitAll()
.antMatchers("/api/**").authenticated()//hasAuthority(AuthoritiesConstants.USER)//permitAll()
.antMatchers("/management/health").permitAll()
.antMatchers("/management/info").permitAll()
.antMatchers("/management/prometheus").permitAll()
.antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN)
.and()
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(jwtAuthorityExtractor)
.and()
.and()
.oauth2Client();
// @formatter:on
}
Редактировать 2: Application.yml
security:
oauth2:
client:
access-token-uri: http://xxx.xxx.xxx.xxx:30080/auth/realms/test/protocol/openid-connect/token
user-authorization-uri: http://xxx.xxx.xxx.xxx:30080/auth/realms/test/protocol/openid-connect/auth
client-id: web_app
client-secret: web_app
scope: openid profile email
resource:
user-info-uri: http://xxx.xxx.xxx.xxx:30080/auth/realms/test/protocol/openid-connect/userinfo
server:
port: 40404
Редактировать 3: Этот вопрос похож на мой:
JHipster - Как добавить маршрут к внешним микросервисам в application.yml
Не было дано никаких ответов, и решение, к которому пришел плакат, состояло в том, чтобы просто разрешить All () на путь / api / **. Это не очень хороший вариант, поскольку он оставляет конечную точку незащищенной.
Еще один похожий вопрос здесь:
Jhipster OAuth 2.0 / OID C Заголовок авторизации аутентификации с токеном носителя
Получено несколько ответов на использование @EnableResourceServer. Это старый пост, и у меня сложилось впечатление, что новая версия приложения Jhipster, в которой я работаю, отлично подходит для этого сценария - я ошибаюсь, заявив об этом?