当前位置: 首页 > 知识库问答 >
问题:

jhipster:Rest服务调用在通过网关路由时返回“401 unauthorized”

詹联
2023-03-14

我有我认为是配置问题,但我似乎找不到它。以下是一些细节:

我们正在运行一个带有keycloak的JHipster网关。环境是Docker compose,据我所知,我们已经完成了JHipster文档中为Docker规定的必要工作。

我们使用oauth2作为身份验证类型。

对我来说,这表明服务正在运行,spring security可以使用我的JWT令牌。

现在,当我尝试通过网关路由到安全服务时,麻烦就开始了。我通过邮递员也用同样的意思。http://gatewayip:port/helloapp/api/hello

现在给我的响应是:键入“https://www.jhipster.tech/problem/problem/problem-with-message”title“unauthorized”status 401 detail“访问此资源需要完全身份验证”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

共有1个答案

索瀚海
2023-03-14

在打开登录SpringSecurity之后,通过添加

@Override
    public void configure(WebSecurity web){
        web.debug(true);
    }

在SecurityConfiguration.java类中,我们可以看到安全头不是由网关转发的。

这将我们引向以下页面:https://github.com/spring-cloud/spring-cloud-netflix/issues/3126

    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
    .
 类似资料:
  • 我正在使用nginx和react。我的nginx.conf文件 根据此配置,nginx为所有路由服务200。假设我的路线是 现在假设有人输入错误的url 在这种情况下,我想抛出404而不落地到nginx级别本身的应用程序。这是否可能在nginx级别处理路由和发送404尽管200和比在REACTE级别处理。 我发现要在nginx级别限制任何特定的路由,我们可以使用下面的代码来实现 但我想限制所有对我

  • 问题内容: 和存在一种奇怪的行为,json_encode而json_decode我找不到解决方案: 我的php应用程序调用了php Web服务。Web服务返回的json如下所示: 现在我想在应用程序中解码json: 但它返回NULL: 我使用php5。来自Web服务的响应的也尝试使用 可能是什么原因? 问题答案: 编辑: 只是做了一些快速检查由OP提供的字符串。大括号前面的小“字符”是。我不知道为

  • 问题内容: 和存在一种奇怪的行为,而我找不到解决方案: 我的php应用程序调用了php Web服务。Web服务返回的json如下所示: 现在我想在应用程序中解码json: 但它返回: 我使用php5。来自Web服务的响应的Content-Type :(也尝试使用) 可能是什么原因? 问题答案: 编辑: 只是做了一些快速检查由OP提供的字符串。大括号前面的小“字符”是UTF-8 B(yte)O(rd

  • : 和 : 根据我找到的一些建议,我尝试从我的eureka服务器中隐藏网关,但问题仍然存在,将其添加到网关中的中:

  • 你好,我是拉威尔的新手,也许这对你们来说太傻了。在laravel 8中,路由web。php我创建了一条如下的路线: 我想问的是,我们也可以从回调视图返回控制器吗?所以在路由 /editprofile中,第二个参数不是'App\Http\Controller\SiteController@edit_profile',而是一个回调函数,如路由'/home'。 但是它返回错误哈哈。假设我不想用__con

  • 我使用Spring创建微服务。我使用Eureka进行服务发现,使用Zuul进行路由。现在我想切换到Spring Cloud Gateway(因为它的非阻塞特性),但是我没有找到自动路由到每个Eureka服务的方法。 例如,如果一个服务'eureka-client'注册到了Eureka,那么Zuul本身就为这个服务提供了类似于localhost:8762/eureka-client的路径。使用Spr