技术中台,服务于 无数个 独立的项目。
每个项目,单独对应1个App和appId。
查询和创建等接口,必须提供appId,区分是哪个app的数据。
而技术中台的平台管理端,是管理所有的数据,appId是可选的。
普通项目的管理端,只管理自己的数据,查询数据的时候appId是固定的,是必填的。
这里面有个经验,getById,removeById,通常写法,只需要id 1个参数。
这涉及到 数据权限控制问题,随便传入1个id,把其他项目的数据删了咋办?
所以,这2个方法,也必须带上appId。
一个项目,如果有数据权限,remove和get的时候,必须带上userId。
但是,技术中台这样的项目,去管理 普通项目的权限控制,有很大难度,每个项目的数据权限控制机制不同,很难有通用实现。
所以,数据权限控制 交给项目自己。
技术中台,控制app层面的 数据权限控制。
具体项目-删除1篇文字-伪代码
|
以上综述:
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日
北京