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

授权在OAuth2客户端资源服务器的网关中不工作

宋瀚海
2023-03-14

我在一个应用程序中使用以下依赖项:SpringCloudGateway、SpringBootOAuth2客户端、SpringBootOAuth2资源服务器。

我使用以下安全配置:

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http, ReactiveClientRegistrationRepository clientRegistrationRepository) {
        
        http.oauth2Login();

        http.logout(logout -> logout.logoutSuccessHandler(
                new OidcClientInitiatedServerLogoutSuccessHandler(clientRegistrationRepository)));


        http.authorizeExchange()
                .pathMatchers("/actuator/health").permitAll()
                .pathMatchers("/auth/realms/ahearo/protocol/openid-connect/token").permitAll()
                .pathMatchers("/v3/api-docs").permitAll()
                .anyExchange().authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt()
                .jwtAuthenticationConverter(userJwtAuthenticationConverter());

         http.csrf().disable().formLogin().disable().httpBasic().disable();
        return http.build();
}

@Bean
public UserJwtAuthenticationConverter userJwtAuthenticationConverter() {
    return new UserJwtAuthenticationConverter();
}

当我执行调用时,我被正确地建议登录,这很好。但有效的只是身份验证,而不是授权。使用调试器时,我可以看到从未调用userJwtAuthenticationConverter()方法来使用JWT之外的角色。

当我在另一个应用程序/微服务中使用相同的方法时,它只是一个OAuth2资源服务器,而不是一个OAuth2客户端,该方法被正确地调用和执行。

应用程序中的安全配置。在Spring云网关应用程序中,yaml如下所示:

security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://localhost/auth/realms/example-realm
          jwk-set-uri: http://localhost/auth/realms/example-realm/protocol/openid-connect/certs
      client:
        registration:
          keycloak:
            client-id: 'example-proxy-client'
            client-secret: 'xxx'
            authorizationGrantType: authorization_code
            redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
            scope: openid,profile,email
        provider:
          keycloak:
            issuer-uri: http://localhost/auth/realms/example-realm
            user-name-attribute: preferred_username

SpringCloudGateway应用程序不可能同时作为OAuth2客户机和资源服务器运行吗?或者我在配置应用程序时犯了错误吗?

共有1个答案

微生俊
2023-03-14

原来我误解了一些基本的OAuth2概念。当我在授权头(隐式流)中发送JWT时,授权本身工作正常。当我试图通过浏览器访问资源时,没有起作用。我被重定向到keydape(授权代码流)的登录页面。在您通过keydove的登录页面登录后,您不会收到JWT,而是一个keydove会话ID。Spring Cloud Gateway无法基于keydove会话ID执行授权(如果我想使用授权代码流,不知道该如何工作,但我使用的是隐式流,所以我现在还可以)。

 类似资料:
  • 我需要了解在我的项目范围内使用autheorizaion服务器的便利性。 我们正在实现我们的服务并将其部署到客户环境中。 客户基础结构已经提供了一种身份验证机制,以便对用户进行身份验证。 此机制拦截所有通信并将用户重定向到“登录”表单。 之后,用户被重定向到我们的服务,我们必须处理和消化它,并使用JWT令牌进行响应。 这是我感到迷茫的地方: 我在想: 使用Spring oauth2 向授权服务器请

  • 我们正在开发一个微服务架构中的应用程序,该应用程序在多个OAuth2提供商(如Google和Facebook)上使用Spring Cloud OAuth2实现登录。我们还在开发自己的授权服务器,并将在下一个版本中集成。 现在,在我们的微服务(即资源服务器)上,我想知道如何处理多个< code>token-info-uri或< code>user-info-uri到多个授权服务器(例如脸书或谷歌)。

  • 我有以下场景:一个客户端应用程序试图访问API网关后面的APIendpoint。我想验证(使用id和秘密)应用程序,如果它是应用程序A允许它访问endpoint/信用,如果它是应用程序B允许它访问endpoint/借方。 我假设API网关应该验证一个调用是否应该被拒绝。你能告诉我我的工作流应该是什么样子,我应该使用什么Keycloak功能吗?

  • 我在下面设置Spring配置: 和Maven设置如下:

  • 我正在使用以下内容: Spring 4.2 Spring security 4.0.2 Spring oauth2 2.0.7 null 资源服务器配置似乎不限于/rest/**,而是覆盖了所有的安全配置。即对受保护的非OAuth资源的调用不受保护(即筛选器没有捕获它们并重定向到登录)。 配置(为了简单起见,我删除了一些内容):

  • 我正在尝试使用Spring构建一个OAuth2授权服务器。问题是我无法让它与登录和授权表单以及资源服务器一起使用oAuth2令牌检索用户数据。 这是我的主要配置,除了用户服务和存储库... 网络安全配置 授权服务器配置 资源服务器配置 用户控制器 正如你所看到的,我给他们下了订单。问题是,如果WebSecurityConfig是第一个,我可以进入/login和/oauth/authorize屏幕,