启动环境+拉取项目+网关过滤器逻辑

发布时间 2023-06-11 17:39:57作者: 一只快乐的柠檬精J

服务器与服务器传输,当前在一台服务器,所有直接找到jenkens,cp拷贝即可,;若是不同的服务器,要用scp

image-20230610094412775

  • 配置源码:仓库,触发器:什么时候构建,构建环境:前端后端

  • 构建后端环境时,需要传参

image-20230610100430494

启动项目,可以不用进入jenkens

image-20230610105250651

  • RBAC 权限控制

    • 用户关联角色,角色关联用户

      image-20230610110742862
    • ​ 权限管理系统是给公司使用,公司中有很多应用A,B,C,D

    • 这些应用都可以在这里进行管理,但是都是属于这个公司

    • 这个组织股那里是被这些应用所共享

      组织结构对应某一家公司

    • 一级组织结构分区,二级组织架构

  • 权限管理

    • 先添加应用

权限管家系统的功能

首先,公司的子系统都会有的功能:认证(账号+密码,即用户登录)+鉴权(控制用户能做什么 )

权限管家即 把这些公共代码抽取出来,系统要进行校验,则通过权限管家进行校验,怎么区分不同系统?

通过应用管理,每一个应用都有不同的应用id,id和数据绑定

我们系统访问权限管家,校验过后,它返回数据:成功或者失败,是否有令牌

过程 : 系统携带用户名和密码给权限管家,它校验过后,会返回以个令牌,系统拿到令牌后返回给前端,进行校验,如果校验成功,则可以访问


权限管家在idea的使用

  • 首先导入依赖,它是黑马开源项目,导入com.itheima.em.auth依赖
  • 配置locla.yml文件,
  • image-20230611152912767

看是怎么具体使用的

  • 如果我们要实现登录,无需自己再写登录,直接调用api即可

  • 通过权限管家系统,可以进行用户信息,角色的增删改查,

  • 接着和神领物流系统进行对接,怎么对接?

  • 通过SDK,即我们封装的模板对象API,获得对象authTemplate。

  • 直接注入authTemplate,使用@Resourse

  • 它里面提供各种方法:做登录,鉴权,查询用户角色,查询用户具备的菜单

  • 但是前提是,必须首先登录,具备令牌之后才能访问


在网关中进行鉴权

认证和鉴权操作依赖权限管家,拿登录做例子,客户端拿到令牌,登陆成功之后,用户可以访问系统,但是每次访问要校验令牌,这里,用到拦截器或者过滤器,考虑到微服务,我们使用网关进行JWT令牌的校验

**

公钥私钥

  • 令牌加密算法分为对称(SH256,加密和解析校验一样,只要是相同字符串即可)和非对称(公钥私钥,世界范围内只有一对)
  • 权限管家生成的token令牌是基于私钥,但是在权限管家中配置了公钥和私钥,因为它也有校验令牌的需要,比如查询角色。。。。。
  • 网关对令牌进行校验解析的时候,必须使用公钥进行校验

看具体怎么使用

之前使用的是GlobelFilter

过滤器流程

  • 首先自定义了一个AuthFilter接口
  • 当发请求过来,首先执行filte()方法,看是否该路径为放行路径
  • 其次校验JWT令牌
  • 继续校验,根据令牌信息(id)查询角色
  • 如果角色为没有权限的快递员等,则返回没有权限

idea代码具体实现

  • 网关里的过滤器工厂

    • 比如说添加请求头这个操作,我们是配置在yml文件的id下的,

      • 效果:当请求当问到该路由,就会被过滤器拦截
      • 实现:通过过滤器工厂AddRequestHeaderGatewayFilterFactory的apply方法实现
        • 该方法不是执行过滤器的业务逻辑只是返回一个接口对象 ---- GatewayFilter
        • 业务逻辑在GatewayFilter的filter方法中执行
      • 注意:过滤器的名字要和工厂前半部分一致
  • 如果自定义过滤器工厂应该怎么办???

    • 写一个类,名字 : XxxGatewayFilterFactory  继承  和网关继承一样{
        
           apply{
      
           返回一个GatewayFilter接口的实现
      
        }
      
      }
      
    • 如何使用,在yml文件中,-Xxx

    • image-20230611163511059

bug1:权限过滤器中,角色没有判断直接返回true,所以所有用户都可以登录

  • 在idea代码中,定义了四个过滤器工厂,分别校验不同用户端的令牌

  • 四个过滤器工厂用的都是同一个过滤器,TokenGatewayFilter

  • 逻辑虽然一样,但是其中业务逻辑不一样

    • 校验令牌不同 : 自定义了接口,里面方法check(), 提供了具体的实现类,由不同的工厂提供

    • 鉴权不同 : 方法auth()

      • 判断逻辑 : 只有指定的角色才能访问后台管理系统

      • 根据当前登录用户获取 用户的角色列表[]

         Long userId = authUserInfoDTO.getUserId();
         Result<List<Long>> resultRole = AuthTemplateFactory.get(token).opsForRole()
                        .findRoleByUserId(userId);
         List<Long> data = resultRole.getData();
        //做一下判断
        if(CollUtil.isEmpty(data)){
          reture false;
        }
        
      • 获取系统配置中允许访问的角色列表[4个]

        该角色已经通过yml配置,我们可以通过@value拿到,亦可以写配置类拿到,这里演示第二种
          @Data
        @Component
        @ConfigurationProperties(prefix = "role")
        public class ReloConfig {
        
            private List<Long> manager;
            private  List<Long> courier;
            private  List<Long> driver;
        }
        
        List<Long> manager = reloConfig.getManager();
        
      • 看是否被包含,或者求交集

        Collection<Long> intersection = CollUtil.intersection(data, manager);
               
        
      • 是否为空,不为空,有权限,登录成功

        return CollUtil.isNotEmpty(intersection);
        

如何做测试

  • 本地测试 : 本地运行 ---- 改地址即可

    • 当前网关有两个 : 本地idea修改的,虚拟机中部署的 ,我们只需要改变nginx中网关地址为本地即可

      -* nginx里面网关的默认地址为127.0.0.1 : 这里配置的是本地,由于nginx和nacos目前配置在一台电脑上,所以就会找虚拟机容器里(192.168.150.101)的东西,这里面的代码是老代码
        
      -* 我们自己写的东西,地址可以通过虚拟机的网卡获得,vm8的网卡为 192.168.150.1,所以只需要访问网卡,找到对应的地址即可
      
  • 在线测试 :把代码推送致远程仓库,用jekens重新部署

    • 提交代码 : 选中gateway , 进行commit
    • 在jekens中手动构建gateway,线上环境运行最新代码