OAuth2 微服务之间的认证

OAuth2 微服务之间的认证

当我们做购物车时, 出现一个需求, 用户 -> 网关 -> 页面渲染服务 -> 订单查询服务

网关给页面渲染服务时带着令牌 (由网关直接写入 request 的 header)

页面渲染服务需要调用订单查询服务里的查询购物车, 通过 feign 的形式去调用, 但是由于订单查询受 OAuth2 保护, feign 无法直接传递令牌, 令牌到页面渲染后无法传递给订单查询

此时可以用 feign 的拦截器, 拦截器应该定义在公共模块中, 因为很多微服务都会使用这个拦截器

1. 引入openfeign依赖

 		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2. 主程序添加 @EnableFeignClients

package com.tx.tcm.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceUserApplication {

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

}

3. yml配置文件添加如下配置;feign 启用 hystrix降级和ribbon 负载均衡和重试

ribbon:
  #与服务器连接超时的时间
  ConnectTimeout: 200000
  #从服务器获取数据的超时时间.
  ReadTimeout: 200000
  #重试负载均衡其他的实例最大重试次数,不包括首次调用
  MaxAutoRetriesNextServer: 1
  #同一台实例最大重试次数,不包括首次调用
  MaxAutoRetries: 1
  #是否所有操作都重试;默认只对GET请求重试, 当设置为true时, 对POST等所有类型请求都重试
  OkToRetryOnAllOperations: true

# feign 默认没有启用 hystrix,添加配置,启用 hystrix
feign:
  hystrix:
    enabled: true
hystrix:
  command:
    fallbackcmd:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 100000 #超时时间,熔断

4. 配置传递

在配置文件ResourceServerConfig新增feign拦截器,传递令牌

    /**
     * token令牌传递
     */
    @Bean
    public RequestInterceptor requestInterceptor(){
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                HttpServletRequest request = attributes.getRequest();
                //添加token
                requestTemplate.header(HttpHeaders.AUTHORIZATION, request.getHeader(HttpHeaders.AUTHORIZATION));

            }
        };
    }

在这里插入图片描述

5. 远程调用log模块接口

创建接口文件LogService.java和LogServiceImpl降级类

@FeignClient(name = "service-log", fallback = LogServiceImpl.class)

  • name:指定远程调用模块的服务名称
  • fallback:指定降级类

LogService.java

package com.tx.tcm.user.system.service;

import com.tx.tcm.user.system.service.impl.LogServiceImpl;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "service-log", fallback = LogServiceImpl.class)
public interface LogService {
    @GetMapping(value = "ping", produces = "application/json;charset=utf-8")
    public String test();
}

LogServiceImpl.java

package com.tx.tcm.user.system.service.impl;

import com.tx.tcm.user.system.service.LogService;
import org.springframework.stereotype.Component;


@Component
public class LogServiceImpl implements LogService {

    @Override
    public String test() {
        return "无法获取";
    }
}

6. 创建controller类,调用上方接口

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单点登录(Single Sign-On,简称SSO)是一种认证机制,允许用户在登录一个应用程序后,无需再次输入凭据即可访问其他应用程序。在微服务架构中,使用OAuth 2.0来实现单点登录是一种常见的做法。OAuth 2.0本来是用于第三方应用请求服务的认证授权机制,但也可以用于实现同一个应用内部服务之间认证。通过OAuth 2.0,我们可以在一个应用中获取访问令牌,然后将该令牌用于其他应用的认证。这样,用户只需要登录一次,就可以访问整个系统的各个服务。 在实现单点登录的过程中,我们需要配置一些参数。在应用的配置文件(如application.properties)中,我们可以设置以下参数: - server port:指定应用的端口号。 - security.oauth2.client.client-id:指定客户端的唯一标识符。 - security.oauth2.client.client-secret:指定客户端的密钥。 - security.oauth2.client.access-token-uri:指定用于获取访问令牌的URI。 - security.oauth2.client.user-authorization-uri:指定用于用户授权的URI。 - security.oauth2.resource.user-info-uri:指定用于获取用户信息的URI。 通过配置这些参数,我们可以实现单点登录的功能,让用户在登录一个应用后,可以无需再次登录即可访问其他应用。这样可以提高用户的体验,并减少重复登录的次数。 引用\[1\]中提到了使用OAuth 2.0来实现单点登录的思路,引用\[2\]中给出了一些配置参数的示例,可以根据实际情况进行配置。引用\[3\]中解释了单点登录的概念和优势。 #### 引用[.reference_title] - *1* [OAuth2.0 实现单点登录](https://blog.csdn.net/qq15035899256/article/details/129541483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [大白话唠唠 Oauth2 与授权认证的那些事儿!](https://blog.csdn.net/qq_42046105/article/details/110211641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [微服务单点登录实现](https://blog.csdn.net/qq_61393507/article/details/121869165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值