首页 > 其他分享 >微服务如何解决用户登录验证问题的流程整理

微服务如何解决用户登录验证问题的流程整理

时间:2024-04-24 21:46:03浏览次数:25  
标签:网关 拦截器 return 登录 验证 流程 模块 服务 public

0-我们通过客户端=》网关=》微服务的顺序访问服务端

1-网关:这一步主要是获取token进行验证,成功后把用户信息保存到请求头以供微服务调取

因为微服务模块比较多,如果每一个都写拦截器会造成不必要的冗余,所以我们统一把拦截器放在网关模块

 网关的信息传递流程为 客户端=》断言=》过滤器=》微服务=》过滤器=》断言=》客户端

通过上面流程我们就知道可以把登录校验问题写的prefilter,这样一旦验证失效就不用访问微服务,完成鉴权功能

基本流程为:获取req-》获取path检查是否可以直接放行(比如登录,或者一些不需要登录也允许的操作)-》通过头信息获取token-》通过token获得用户信息-》携带用户信息转发给微服务

@Component
@RequiredArgsConstructor
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    private final AuthProperties authProperties;

    private final JwtTool jwtTool;
    private final AntPathMatcher antPathMatcher = new AntPathMatcher();
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取req
        ServerHttpRequest request = exchange.getRequest();
        // 获取路径
        RequestPath path = request.getPath();
        // 判断是否放行
        if (exclude(path.toString())) {
            return chain.filter(exchange);
        }
        // 获取token
        String token = null;
        List<String> headers = request.getHeaders().get("authorization");
        if (headers != null && !headers.isEmpty()) {
            token = headers.get(0);

        }
        Long userId = null;
        try {
            userId = jwtTool.parseToken(token);
        } catch (UnauthorizedException e) {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        // 传递用户信息,这样在后续的过滤器中就可以获取到用户信息了
        String userIdString = userId.toString();
        ServerWebExchange serverWebExchange = exchange.mutate()
                .request(builder -> {
                    builder.header("user-info", userIdString);
                }).build();
        return chain.filter(serverWebExchange);

    }

    private boolean exclude(String string) {
        for (String way : authProperties.getExcludePaths()) {
            if (antPathMatcher.match(way, string)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public int getOrder() {
        return 1;
    }
}

 

2.微服务:这一步我们主要通过拦截器获取用户信息,以便使用

因为微服务模块比较多,如果每一个都写拦截器会造成不必要的冗余,所以我们统一把拦截器放在常用类模块,与上述非阻塞式不同,这里拦截器作为一个bean,供其他模块调用,因此我们要记住把bean注册在resources\META-INF\spring.facotories中。每当我们启动Context时,都会先扫描starter中的工厂,再通过这个工厂去管理非本模块中的bean。工厂创建如下例:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.hmall.common.config.JsonConfig

拦截器只需为请求头添加一个用户信息,即无论如何都会放行。在结束后及时销毁以保证信息安全

public class UserInfoInterceptors implements HandlerInterceptor{
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String userInfo = request.getHeader("user-info");
        if(StrUtil.isNotBlank(userInfo))
            UserContext.setUser(Long.valueOf(userInfo));
        return true;
    }
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        UserContext.removeUser();
    }
}

然后,我们在实现WebMvcConfig的接口中添加拦截器(这里为什么添加了条件注解:在网关模块中无法提供user-info请求头,因为网关模块压根没有引入springWEB,而DispatcherServlet.class作为springMVC的重要组件,个人理解DispatcherServlet约等于struct)

@Configuration
@ConditionalOnClass(DispatcherServlet.class)
public class MvcConfig implements WebMvcConfigurer {
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInfoInterceptors());
    }
}

完成上述操作后,我们已经可以在网关---微服务之间搭起用户信息传递的桥梁

但是我们还有微服务---微服务之间的通信问题没有解决,因为微服务=》微服务是基于openFeign发送,他明显不携带我们创建的请求头。基于此,我们可以在openFeign中创建一个拦截器,效仿网关=》微服务,添加一个bean

public class DefaultFeignConfig {
    @Bean
    public RequestInterceptor requestInterceptor(){
        return new RequestInterceptor(){

            @Override
            public void apply(RequestTemplate template) {
                Long id = UserContext.getUser();
                if(id!=null)
                    // 添加公共参数
                    template.header("user-info", id.toString());
            }
        };
    }
}

 

那么这两个拦截器有什么不同?

common中的拦截器我们称为C,而openFeign中的拦截器我们称为o,

首先C是springMVC的拦截器;而O是feign中的拦截器。

c的拦截器是被其他模块调用,需要在其他模块启动的时候自动加载和应用,因此他需要装入spring.factroies中。当我们实现WebMvcConfigurer时,并不需要@bean来注册,springMVC会自动完成,简而言之:c是由springMVC管理生命周期;

而o的拦截器是feign中的拦截器,并不同于spring,不需要添加到mvc即可生效

总的来说拦截器是由mvc注册的,一般不需要bean管理

标签:网关,拦截器,return,登录,验证,流程,模块,服务,public
From: https://www.cnblogs.com/kun1790051360/p/18156418

相关文章

  • mysql慢sql优化流程
    #查询慢sqlselectdb,time,infofromINFORMATION_SCHEMA.processlistwhereinfoisnotnull;#查看执行计划explainSELECTCOUNT(1)FROMtables_nameWHEREvalid=1;#查看表索引showindexfromtables_name; #查看表数据selectcount(*)fromtables_nam......
  • 一个客户端请求 跟服务网关 服务器 服务后端之间的流程是什么样的?
    一个客户端请求经过服务网关到达服务器和服务后端的流程通常包括以下几个步骤:客户端发起请求:客户端发送请求到服务网关,请求可以是HTTP请求、RPC请求等。服务网关路由:服务网关接收到请求后,根据配置的路由规则将请求路由到相应的服务后端。路由规则可以根据......
  • 安防监控/智能分析EasyCVR视频汇聚平台海康/大华/宇视摄像头国标语音GB28181语音对讲
    一、背景分析近年来,国内视频监控应用发展迅猛,系统接入规模不断扩大,涌现了大量平台提供商,平台提供商的接入协议各不相同,终端制造商需要给每款终端维护提供各种不同平台的软件版本,造成了极大的资源浪费。各地视频大规模建设后,省级、国家级集中调阅,对重特大事件通过视频掌握现场并进......
  • 利用自定义流程表单开发的优势,实现流程化发展!
    要想实现流程化发展,通过低代码技术平台以及自定义流程表单开发的力量,可以将效率大大提升,便于企业进行数字化管理。拥有够灵活、可维护、易操作等优势特点的低代码技术平台拥有强劲的市场竞争力,逐渐在市场中脱颖而出,如果将自定义流程表单开发的优势特点发挥极致,就能快速实现流程化......
  • 【前端开发】前端编写Dockerfile构建镜像流程
    1、demo#Dockerfile#FROMnode:18//基础镜像,node服务就用node基础镜像#切换到root用户USERroot#创建工作区目录WORKDIR/appENVBASEPATH/app#复制文件到工作区COPYpackage.jsonpackage-lock.jsonecosystem.config.js.npmrc$BASEPATH/COPY/src$BASE......
  • 华企盾的面试流程,华企盾招聘流程
    北京华企盾科技有限责任公司是一家知名的企业服务平台,为各类企业提供安全合规等解决方案。作为一家企业安全领域知名度高的公司,华企盾的面试流程非常严谨和专业。华企盾的面试流程可以分为简历筛选、初试、复试和终面四个阶段。在简历筛选阶段,人力资源部门会对申请人的简历进行初......
  • 1名工程师轻松管理20个工作流,创业企业用Serverless 让数据处理流程提效
    北京语势科技有限公司成立于2023年6月,语势科技定位为“智能投资时代的主题入口”,在资管行业从以机构为核心转向以用户为核心的变革时代,通过打造主题投资引擎,赋能普惠投资一体化,打造以投资者和资管机构为主题和核心、自然语言交互形式为入口的“新桥梁”。语势科技日均处理万条金......
  • DRF之请求执行流程和APIView源码分析
    DRF之请求执行流程和APIView源码分析【一】路由入口fromdjango.contribimportadminfromdjango.urlsimportpathfrombookimportviewsurlpatterns=[path('admin/',admin.site.urls),#原来的路由写法#path('test_http/',views.TestHttpResponse),......
  • 与开源数据可视化平台深度融合,进入流程办公新时代!
    进入新时代,需要有新的软件平台实现创新智造。开源数据可视化平台是流行于各中小型企业中的快速框架软件平台,够灵活、易操作、好维护、可视化操作界面等多个优势特点,在降本增效、减少成本支出、实现流程化办公等方面具有事半功倍的应用价值和效果。流辰信息作为专业的服务商,将不遗......
  • 甘特图是什么?利用甘特图来优化项目管理流程
     甘特图是项目管理软件中十分常见的功能,可以说每一个项目经理都要学会使用甘特图才能更好的交付项目。什么是甘特图?甘特图用来做什么?简单来说一种将项目任务与时间关系直观表示的图表,直观地展示了任务进度和持续时间。图片来源zz-plan甘特图一、甘特图的定义和特点1.定义......