使用带有 oauth2 的 spring 云网关

Posted

技术标签:

【中文标题】使用带有 oauth2 的 spring 云网关【英文标题】:use spring cloud gateway with oauth2 【发布时间】:2018-09-22 12:54:31 【问题描述】:

我在使用 Spring Cloud Gateway 时遇到问题

是如果任何依赖直接或递归调用spring-boot-starter-tomcat

它不会工作,因为它会启动嵌入式tomcat服务器而不是spring cloud gateway使用的netty服务器

我开始通过排除这个依赖来解决这个问题

        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>

spring cloud 网关运行成功

但有时我想使用 spring-cloud-starter-oauth2 来使用 @EnableOAuth2Sso

我开始使用

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-oauth2</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

当时我面临着抛出异常的大问题

原因:java.lang.IllegalStateException:无法自省类 org.springframework.security.oauth2.config.annotation.web.configuration.OAuth2ClientConfiguration 上的注释方法 ......

原因:java.lang.NoClassDefFoundError: javax/servlet/Filter

【问题讨论】:

您找到解决方案了吗?我面临同样的问题 我也面临这个问题,在花了将近 2 天的时间后找不到任何东西......只是想知道这个问题是否以某种方式得到解决,是否有一些参考文件可以参考。 【参考方案1】:

如您所见,Spring 云网关使用响应式模型并且基于 netty 而不是 tomcat。响应式更改是一个重大转变,目前 Spring Security 不支持,但工作正在进行中,您可以通过 https://github.com/spring-cloud/spring-cloud-gateway/issues/179 跟踪它

【讨论】:

我也面临这个问题,在花了将近 2 天的时间后找不到任何东西......只是想知道这个问题是否以某种方式得到解决,是否有一些可以参考的参考文件 【参考方案2】:

使用以下依赖项(我从我的 build.gradle 复制)

dependencies 
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    implementation 'org.springframework.cloud:spring-cloud-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

按以下方式对您的网关应用程序进行最低限度的编码

@SpringBootApplication
public class App 

    @Bean
    public ForwardedHeaderTransformer forwardedHeaderTransformer() 
        return new ForwardedHeaderTransformer();
    

    public static void main(String[] args) 
        SpringApplication.run(App.class, args);
    

在 application.yml 中配置

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: XXX
            client-secret: YYY

我正在积极构建我的堆栈,将 OAuth2 与 Docker Swarm Discovery https://github.com/trajano/spring-cloud-demo.git 结合使用,以便您了解它的实际工作原理。

【讨论】:

【参考方案3】:

spring boot 2.1 和 spring security 5 已经解决了这个问题 看到这个example

【讨论】:

以上是关于使用带有 oauth2 的 spring 云网关的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud gateway + oauth2 实现网关统一权限认证

如果下游服务响应 401,如何在 Zuul API 网关中触发 OAuth2 身份验证

调用spring oauth2授权服务器时Spring Cloud Gateway卡住

spring security oauth2认证中心 集成zuul网关的代码分析

认证开发+Oauth2(授权码)模式+Spring Security+网关解说

使用带有oauth2的Spring启动但面临一些问题