技术中台,服务于 无数个 独立的项目。

每个项目,单独对应1个App和appId。

 

查询和创建等接口,必须提供appId,区分是哪个app的数据。

而技术中台的平台管理端,是管理所有的数据,appId是可选的。

普通项目的管理端,只管理自己的数据,查询数据的时候appId是固定的,是必填的。

 

这里面有个经验,getById,removeById,通常写法,只需要id  1个参数。

这涉及到 数据权限控制问题,随便传入1个id,把其他项目的数据删了咋办?

所以,这2个方法,也必须带上appId。

 

一个项目,如果有数据权限,remove和get的时候,必须带上userId。

但是,技术中台这样的项目,去管理 普通项目的权限控制,有很大难度,每个项目的数据权限控制机制不同,很难有通用实现。

所以,数据权限控制 交给项目自己。

 

技术中台,控制app层面的 数据权限控制。

具体项目-删除1篇文字-伪代码

 

public void removePost(Integer userId,Integer postId){
 
Post post= postService.getById(postId);
 
if(post.getUserId() != userId){
 
throw new NoPermissionException("");
 
}
 
tpPostService.remove(appId,postId);
 
}

 

 

以上综述:

1)、userId,具体项目自己的数据权限控制。

2)、appId,技术中台 不同项目之间的数据权限隔离。

 

3)、还有最常见的token校验,接口调用 需要权限控制。

调用接口之前,用appId、apiCode、password之类的账号密码,获得token。

有token才有接口调用权限,调用时,技术平台还需要检查 该token对应的 app,有哪些 API的权限。

 

 

再做1点补充:

4)、remove方法,可能还需要记录  当时的操作用户。

这个 技术中台,可以统一封装。也可以只提供普通的 API,具体项目 自己填写相关字段。

 

5)、再考虑到,1个接口的2类 业务方

getById,技术中台的管理端,只需要id 一个参数就行。

具体项目,appId必传,必须校验数据权限。

 

最终落实到 接口,可以放在同1个Service,也可以放在2个Service。

比如:

面向 具体项目的接口

public interface UserService{
    void removeById(Integer appId,Integer userId);
}

面向内部技术中台管理端的接口

public interface TpUserService extends UserService{
    void  removeById(Integer userId);
}

 

结论:

通用参数:appId、token(后期加上)

业务参数:userId、User

 

数据权限控制:技术中台appId、具体项目userId

接口权限控制:token,先提供单独登录接口 login(appId, secret);

 

天鸟技术/FansUnion/雷哥

2019年11月16日

北京