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

带有OAuth2的Spring Security 5 rest

鞠通
2023-03-14

我想实现一个客户机,它应该简单地用一个OAuth2令牌发送一些rest调用。使用spring-security-oauth,很容易将OAuth2RestTemplate与客户机凭据流一起使用。今天,我看到这些类中的大多数在2.4.0中不被推荐,建议使用Spring Security5。我已经搜索并查看了迁移指南[1],但我不明白如何执行一些简单的rest调用,该调用使用Spring Security5获取令牌。我想我甚至不确定需要什么样的图书馆。因此,我基本上要寻找的是一种方法,以编程方式(而不是通过属性)向某种rest模板提供客户机ID、客户机秘密和标记endpoint,并向特定的URL发送请求。

--编辑--

 @Test
    public void test() {
        WebClient webClient = getWebClient();
        ResponseSpec retrieve = webClient.get().uri("https://somepath")
                .attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId(REG_ID)).retrieve();
        Flux<String> result = retrieve.bodyToFlux(String.class); // flux makes no sense here, use Mono instead 
        Mono<List<String>> response = result.collectList();
        List<String> block = response.block();
        System.out.print(block);
        System.out.print("debug");
    }

    public WebClient getWebClient() {
        Builder clientRegestrationBuilder = ClientRegistration.withRegistrationId(REG_ID);
        clientRegestrationBuilder.clientId(CLIENT_ID);
        clientRegestrationBuilder.clientSecret(CLIENT_SECRET);
        clientRegestrationBuilder.tokenUri(TOKEN_ENDPOINT);
        clientRegestrationBuilder.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS);
        ClientRegistration clientRegistration = clientRegestrationBuilder.build();

        ReactiveClientRegistrationRepository repo = new InMemoryReactiveClientRegistrationRepository(clientRegistration);

        ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(repo,
                new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
        return WebClient.builder().filter(oauth).build();
    }

敬蒙蒂

[1]https://github.com/spring-projects/spring-security/wiki/oauth-2.0-迁移指南

共有1个答案

戚浩淼
2023-03-14

下面的代码是一个单元测试,它展示了如何以编程方式完成clientregistration。在“真实”的spring场景中,我想ClientRegistration应该作为bean提供,并最终作为列表注入到ReactiveClientRegistrationRepository······

 public void test() {
        WebClient webClient = getWebClient();
        ResponseSpec retrieve = webClient.get().uri("https://somepath")
                .attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId(REG_ID)).retrieve();
        Flux<String> result = retrieve.bodyToFlux(String.class); // flux makes no sense here, use Mono instead 
        Mono<List<String>> response = result.collectList();
        List<String> block = response.block();
        System.out.print(block);
        System.out.print("debug");
    }

    public WebClient getWebClient() {
        Builder clientRegestrationBuilder = ClientRegistration.withRegistrationId(REG_ID);
        clientRegestrationBuilder.clientId(CLIENT_ID);
        clientRegestrationBuilder.clientSecret(CLIENT_SECRET);
        clientRegestrationBuilder.tokenUri(TOKEN_ENDPOINT);
        clientRegestrationBuilder.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS);
        ClientRegistration clientRegistration = clientRegestrationBuilder.build();

        ReactiveClientRegistrationRepository repo = new InMemoryReactiveClientRegistrationRepository(clientRegistration);

        ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(repo,
                new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
        return WebClient.builder().filter(oauth).build();
    }
 类似资料:
  • 这是我在使用Angular 1.5应用程序发出请求时Chrome控制台中得到的: XMLHttpRequest无法加载http://localhost:8080/api/oauth/token.对预检请求的响应没有通过权限改造检查:请求的资源上没有“访问控制允许起源”标头。因此不允许访问起源“http://localhost:8000”。响应的HTTP状态代码为401。 当我删除OAuth2配置时

  • 我是新来的Spring Security,并试图开发Spring Boot应用程序与谷歌登录使用OAuth2下运行的主机名: 8080。这个程序是背后的Apache反向代理服务器https://url.com. Spring启动版本2.1。0 Spring Security版本5.1.1 build.gradle: 应用yml: Spring Security配置: 我请求https://url.

  • 我用Spring Security和OAuth2保护了我的Spring REST API,我可以成功地检索令牌并访问我的API。我的应用程序自定义了OAuth2客户端。 当我添加第二个antmatcher/anonymous时,它就无法工作,而且它也没有真正表达我的意图--例如,我不想对GETs进行匿名访问,而是在POSTs上进行身份验证(使用很容易做到)。 如何使OAuth2身份验证可选?

  • 包在R中提供CURL包装器(请参阅包留档)。 我是HTTP和API的新手。我的麻烦是长胖。0身份验证无法工作。我尝试过各种语法,要么出现错误,要么出现状态401。 使用oauth2的正确方法是什么。0标记并使用发出请求?

  • 设置是这样的:作为身份验证服务器,我有一个密钥斗篷,作为API-Gateway,我使用Spring-云网关,NetflixEureka客户端作为发现客户端。当然,我需要用户管理,一个“简单”的注册,用于未经身份验证的人员,并将人员注册为具有管理员角色的用户。资源服务器的WebSecurityConfig(用户管理服务)看起来像这样: 注册控制器看起来像这样: 因此,如果一切都在运行,我向本地主机上