小编Dar*_*the的帖子

Spring Security 5在Application Runner中调用OAuth2 Secured API会导致IllegalArgumentException

给定以下代码,是否可以在应用程序运行程序中调用受客户端凭据保护的API?

@Bean
public ApplicationRunner test(
    WebClient.Builder builder,
    ClientRegistrationRepository clientRegistrationRepo, 
    OAuth2AuthorizedClientRepository authorizedClient) {
        return args -> {
            try {
                var oauth2 =
                    new ServletOAuth2AuthorizedClientExchangeFilterFunction(
                        clientRegistrationRepo,
                        authorizedClient);
                oauth2.setDefaultClientRegistrationId("test");
                var response = builder
                    .apply(oauth2.oauth2Configuration())
                    .build()
                    .get()
                    .uri("test")
                    .retrieve()
                    .bodyToMono(String.class)
                    .block();
                log.info("Response - {}", response);
            } catch (Exception e) {
                log.error("Failed to call test.", e);
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

该代码由于以下原因而失败:

java.lang.IllegalArgumentException: request cannot be null
Run Code Online (Sandbox Code Playgroud)

全栈,

java.lang.IllegalArgumentException: request cannot be null
    at org.springframework.util.Assert.notNull(Assert.java:198) ~[spring-core-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizedClientRepository.loadAuthorizedClient(HttpSessionOAuth2AuthorizedClientRepository.java:47) ~[spring-security-oauth2-client-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.oauth2.client.web.reactive.function.client.ServletOAuth2AuthorizedClientExchangeFilterFunction.populateDefaultOAuth2AuthorizedClient(ServletOAuth2AuthorizedClientExchangeFilterFunction.java:364) ~[spring-security-oauth2-client-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.oauth2.client.web.reactive.function.client.ServletOAuth2AuthorizedClientExchangeFilterFunction.lambda$null$2(ServletOAuth2AuthorizedClientExchangeFilterFunction.java:209) ~[spring-security-oauth2-client-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.web.reactive.function.client.DefaultWebClient$DefaultRequestBodyUriSpec.attributes(DefaultWebClient.java:234) …
Run Code Online (Sandbox Code Playgroud)

java spring-security spring-boot spring-webflux

7
推荐指数
1
解决办法
838
查看次数

Spring Security 5.1 - 使用 WebClient 获取客户端凭据流的令牌

我正在尝试通过webclient以下设置获取不记名令牌,以便对 servlet 应用程序中的安全资源服务器进行集成测试。

spring:
  security:
    oauth2:
      client:
        registration:
          idp:
            clientId: id
            clientSecret: secret
            authorization-grant-type: client_credentials
            scope: read
        provider:
          idp:
            authorization-uri: myidp/authorization.oauth2
            token-uri: myidp/token.oauth2
            user-info-uri: myidp/userinfo.openid
            user-name-attribute: name
Run Code Online (Sandbox Code Playgroud)

还有豆子,

    @Bean
    WebClient webClient(ClientRegistrationRepository clientRegistrations,
            OAuth2AuthorizedClientRepository authorizedClients) {
        ServletOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServletOAuth2AuthorizedClientExchangeFilterFunction(
                clientRegistrations, authorizedClients);
        // (optional) explicitly opt into using the oauth2Login to provide an access token implicitly
        // oauth.setDefaultOAuth2AuthorizedClient(true);
        // (optional) set a default ClientRegistration.registrationId
        // oauth.setDefaultClientRegistrationId("client-registration-id");
        return WebClient.builder().apply(oauth.oauth2Configuration()).build();
    }
Run Code Online (Sandbox Code Playgroud)

并将网络客户端自动连接到测试并像这样调用它,

webClient.get().uri("http://localhost:" + port + "/web/it")
                .attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId("idp")).retrieve()
                .bodyToMono(String.class).block();
Run Code Online (Sandbox Code Playgroud)

我的假设是,交换功能要么获取访问令牌(如果可用),要么调用从 …

java spring spring-security spring-boot

3
推荐指数
1
解决办法
9275
查看次数

单元测试时如何跳过@PostConstruct

我有一个计划任务,每天晚上汇总数据。每当我启动应用程序时,任务就会运行,当我在应用程序上运行 jUnit 测试时,我想阻止它运行。

@Scheduled(cron = "0 0 0 1 * ?")
public void SalesDataAggregation() {
    //aggregation
}
Run Code Online (Sandbox Code Playgroud)

编辑

上面的方法也在这里被调用

@PostConstruct
public void init(){
    SalesDataAggregation();
}
Run Code Online (Sandbox Code Playgroud)

java spring junit4 postconstruct

2
推荐指数
1
解决办法
6417
查看次数