JHipster:通过网关路由时,Rest 服务调用 return“401 Unauthorized”
JHipster: Rest service calls return "401 Unauthorized" when routing through the gateway
我是微服务和 JHipster 的新手,所以请耐心等待并在必要时帮助我。
我认为是配置问题,但我似乎找不到它。以下是一些详细信息:
我们是 运行 带有 Keycloak 的 JHipster 网关。环境是 Docker compose,据我所知,我们已经完成了 JHipster 文档中为 docker.
规定的必要工作
我们使用 oauth2 作为身份验证类型。
已部署是仅供休息的资源。有两个调用的最简单情况:
/api/hello -> 应该 return "I say Hello"
/free/hello -> 应该 return "I am free!"
/api/hello 调用应该是安全的,而 /free/hello 调用显然不是。
当我通过网关访问 /free/hello 服务时,即 http://gatewayip:port/helloapp/free/hello,我得到了预期的响应 "I am free!"
所以我希望网关已启动并且 运行 和路由流量。
对于安全服务,我使用 postman 首先获取 JWT 令牌。
当我直接点击服务时,即 serverip:appPort/api/hello 我得到了我期望的响应
这对我来说表明服务是 运行 并且 spring 安全性可以使用我的 JWT 令牌。
现在,当我尝试通过网关路由到安全服务时,问题就来了。我通过 postman 使用相同的标记。 http://gatewayip:port/helloapp/api/hello
This now gives me the response:
type "https://www.jhipster.tech/problem/problem-with-message"
title "Unauthorized"
status 401
detail "Full authentication is required to access this resource"
path "/api/hello"
message "error.http.401"
是否有我可以遵循的常见问题解答或清单来尝试进行故障排除?
请让我知道我可以添加哪些信息来提供帮助。
编辑:
安全配置:
@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:
这个问题和我的相似:
没有给出答案,poster 得到的解决方案是在 /api/** 路径上使用 permitAll()。这不是一个很好的选择,因为它会使端点不安全。
另一个类似的问题在这里:
这收到了一些使用@EnableResourceServer 的答案。这是一个较旧的 post,我的印象是我 运行 的 Jhipster 应用程序的较新版本很好地满足了这种情况 - 我说错了吗?
通过添加
在 SpringSecurity 中打开登录后
@Override
public void configure(WebSecurity web){
web.debug(true);
}
在 SecurityConfiguration.java class 中我们可以看到安全 headers 没有被网关转发。
我们来到了这个页面:https://github.com/spring-cloud/spring-cloud-netflix/issues/3126
这就解释了原因。
当更改配置中的zuul参数时(gateway.yml/jhipster-registry.yml):
zuul: # those values must be configured depending on the application specific needs
.
.
ignore-security-headers: false
ignored-headers: cookie,set-cookie
sensitiveHeaders: Cookie,Set-Cookie
.
请注意,出于安全原因,默认配置不包括敏感内容的转发 headers,因此请确保您在更改此设置时了解自己在做什么。
我是微服务和 JHipster 的新手,所以请耐心等待并在必要时帮助我。
我认为是配置问题,但我似乎找不到它。以下是一些详细信息:
我们是 运行 带有 Keycloak 的 JHipster 网关。环境是 Docker compose,据我所知,我们已经完成了 JHipster 文档中为 docker.
规定的必要工作我们使用 oauth2 作为身份验证类型。
已部署是仅供休息的资源。有两个调用的最简单情况: /api/hello -> 应该 return "I say Hello" /free/hello -> 应该 return "I am free!"
/api/hello 调用应该是安全的,而 /free/hello 调用显然不是。
当我通过网关访问 /free/hello 服务时,即 http://gatewayip:port/helloapp/free/hello,我得到了预期的响应 "I am free!"
所以我希望网关已启动并且 运行 和路由流量。
对于安全服务,我使用 postman 首先获取 JWT 令牌。
当我直接点击服务时,即 serverip:appPort/api/hello 我得到了我期望的响应
这对我来说表明服务是 运行 并且 spring 安全性可以使用我的 JWT 令牌。
现在,当我尝试通过网关路由到安全服务时,问题就来了。我通过 postman 使用相同的标记。 http://gatewayip:port/helloapp/api/hello
This now gives me the response: type "https://www.jhipster.tech/problem/problem-with-message" title "Unauthorized" status 401 detail "Full authentication is required to access this resource" path "/api/hello" message "error.http.401"
是否有我可以遵循的常见问题解答或清单来尝试进行故障排除?
请让我知道我可以添加哪些信息来提供帮助。
编辑:
安全配置:
@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: 这个问题和我的相似:
没有给出答案,poster 得到的解决方案是在 /api/** 路径上使用 permitAll()。这不是一个很好的选择,因为它会使端点不安全。
另一个类似的问题在这里:
这收到了一些使用@EnableResourceServer 的答案。这是一个较旧的 post,我的印象是我 运行 的 Jhipster 应用程序的较新版本很好地满足了这种情况 - 我说错了吗?
通过添加
在 SpringSecurity 中打开登录后@Override
public void configure(WebSecurity web){
web.debug(true);
}
在 SecurityConfiguration.java class 中我们可以看到安全 headers 没有被网关转发。
我们来到了这个页面:https://github.com/spring-cloud/spring-cloud-netflix/issues/3126
这就解释了原因。
当更改配置中的zuul参数时(gateway.yml/jhipster-registry.yml):
zuul: # those values must be configured depending on the application specific needs
.
.
ignore-security-headers: false
ignored-headers: cookie,set-cookie
sensitiveHeaders: Cookie,Set-Cookie
.
请注意,出于安全原因,默认配置不包括敏感内容的转发 headers,因此请确保您在更改此设置时了解自己在做什么。