oauth2.0 Spring Cloud Gateway不重定向到授权服务器

sh7euo9m  于 2024-01-06  发布在  Spring
关注(0)|答案(1)|浏览(221)

我正在将spring cloud gateway应用程序设置为OAuth2客户端。在安全配置类中,我设置了一些白名单路径。如果任何未经授权的用户想要访问任何安全路径,他/她应该被自动重定向到google登录同意页面。但是,在我的情况下,这个 * 自动重定向没有发生 *。而是在访问任何安全路径时,我得到了一个401错误。
blog是我的示例代码-

@SpringBootApplication
public class SsoApplication {

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

    @RestController
    public class WelcomeController {

        @GetMapping
        public String openPath() {
            return "this is open path";
        }

        @GetMapping("/secured")
        public String securedPath() {
            return "Accessing secured path";
        }
    }
}

@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {
        return http
                .authorizeExchange(exchange -> exchange
                        .pathMatchers("/", "/*.css", "/*.js", "/favicon.ico").permitAll()
                        .pathMatchers("/actuator/**").permitAll()
                        .anyExchange().authenticated()
                )
                .exceptionHandling(exceptionHandling -> exceptionHandling
                        .authenticationEntryPoint(new HttpStatusServerEntryPoint(HttpStatus.UNAUTHORIZED)))
                .oauth2Login(Customizer.withDefaults())
                .build();
    }
}

字符串
application.yml

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: #client_id#
            client-secret: #secret#
            redirect-uri: "{baseUrl}/login/oauth2/code/google"
server:
  port: 9999


build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.1'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2023.0.0")
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'io.projectreactor:reactor-test'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}


我试过了-
1.在SecurityWebFilterChain bean上添加了@Order(Ordered.HIGHEST_PRECEDENCE)
访问安全路径时出现HTTP错误401,未重定向到登录页面
1.从SecurityConfig类中删除了@Configuration注解
解决了重定向的问题,但所有的白名单路径成为限制(我想知道为什么)!3.删除@EnableWebFluxSecurity和保留@Configuration给HTTP错误401访问安全路径,不重定向到登录页面。4.添加redirection-uri: "{baseUrl}/login/oauth2/code/google"在应用程序。yml给HTTP错误401访问安全路径,不重定向到登录页面。
在场景1和场景3中,如果我手动点击/oauth2/authorization/google,它会将我重定向到登录页面。
我尝试用spring-boot-starter-web应用程序实现同样的事情;一切都按预期工作

更新

【显然不是,我并没有在spring-boot-web上添加authenticationEntryPoint应用,所以这款应用才如@ch4mp所说的那样正常运行。】
任何想法,为什么这是发生在spring-cloud-gateway应用程序,我可以做些什么来解决这个问题?

k3fezbri

k3fezbri1#

您显式请求401(而不是302,这是使用oauth2Login的OAuth2客户端的默认值)。
尝试删除

.exceptionHandling(exceptionHandling -> exceptionHandling
                        .authenticationEntryPoint(new HttpStatusServerEntryPoint(HttpStatus.UNAUTHORIZED)))

字符串

相关问题