服务器与服务器传输,当前在一台服务器,所有直接找到jenkens,cp拷贝即可,;若是不同的服务器,要用scp
- 配置源码:仓库,触发器:什么时候构建,构建环境:前端后端
- 构建后端环境时,需要传参
启动项目,可以不用进入jenkens
-
RBAC 权限控制
-
用户关联角色,角色关联用户
-
权限管理系统是给公司使用,公司中有很多应用A,B,C,D
-
这些应用都可以在这里进行管理,但是都是属于这个公司
-
这个组织股那里是被这些应用所共享
组织结构对应某一家公司
-
一级组织结构分区,二级组织架构
-
-
权限管理
- 先添加应用
权限管家系统的功能
首先,公司的子系统都会有的功能:认证(账号+密码,即用户登录)+鉴权(控制用户能做什么 )
权限管家即 把这些公共代码抽取出来,系统要进行校验,则通过权限管家进行校验,怎么区分不同系统?
通过应用管理,每一个应用都有不同的应用id,id和数据绑定
我们系统访问权限管家,校验过后,它返回数据:成功或者失败,是否有令牌
过程 : 系统携带用户名和密码给权限管家,它校验过后,会返回以个令牌,系统拿到令牌后返回给前端,进行校验,如果校验成功,则可以访问
权限管家在idea的使用
- 首先导入依赖,它是黑马开源项目,导入com.itheima.em.auth依赖
- 配置locla.yml文件,
看是怎么具体使用的
-
如果我们要实现登录,无需自己再写登录,直接调用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
-
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,线上环境运行最新代码