对2b、2c账号的思考

原创
2019/10/13 22:51
阅读数 4.8K
  • 2b:to business,对商业(机构);2c:to consumer,对消费者(个人)
  • 2b的产品:主要针对机构、企业的产品;2c的产品:主要针对消费者、个人的产品

假设你想推出一款针对记者,提高他们工作效率的产品,那么在设计账号体系时需要好好思考这个问题:这款产品它是2b还是2c的

不要小看这个问题,这个问题的答案会决定这个产品的账号体系的结构,以及账号体系后续的可扩展性。有这么严重么?是的。

那好,那就先回答这个问题:国内的记者大部分都是属于机构的,比如新华社、人民日报等。这些报社都是机构,假设这款产品就面对2b的产品。要想把产品推广到这些机构,暂且先按照面向2b的模式去设计账号体系。考虑下面的问题:


面向2b的模式

  1. 一个机构往往很多人,第一个问题就是能够把一个机构下的用户都归属到这个这个机构;
  2. 第二个问题:谁来创建机构中的用户?
  3. 第三个问题:机构中的用户如何登陆,通过手机?邮箱?用户名?

把这三个看似简单的问题考虑清楚,基本上就能设计出正确2b账号体系。那一一来回答这三个问题:

  1. 这个问题好解决,我在用户表中增加一个字段orgId用来标识这个用户是属于哪个机构;必须先有机构实体才有机构用户,机构用户不能脱离机构
  2. 第二个问题映射到机构中来:肯定是主管人事的领导把你拉到这个企业中来的,那么在产品中也应该由这个角色帮你创建账号。我们暂且将这个角色叫做管理员,这里需要注意的是一个机构中的管理员往往有多个,设计的表结构的时候需要考虑到这一点。同理,机构中还有其他的角色; 避免用显示字段来表示用户角色,应该用权限去划分用户角色
  3. 第三个问题其实是在问:到底什么才是用户在这个机构中的标识,手机号?不,不能是手机号。因为手机号是属于个人的,不随着机构的产生而产生、机构的消亡而消亡。邮箱同理,也不合适(这里指的是个人邮箱,机构专属邮箱除外)。所以最好使用使用机构专属用户名(以及任意只要在你这个产品上不会重复的标识,如企业专属个人邮箱)。不能用个人信息作为机构用户标识,因为个人信息属于个人,用户标识需要做到机构级别的隔离

回答完这三个问题,可以看到该账号体系本质上是面向机构实体的。

在这种模式下,假设有一个记者叫小明,小明既属于新华社北京分部有属于新华社浙江分部。那么小明应该在这两个机构中都有一个账号,几个例子:

  • 新华社北京分部的账号为:小明@新华社北京分部
  • 新华社浙江分部的账号为:小明@新华社浙江分部

这两个账号互不相干,账号数据也没有打通。这种模式的典型代表就是阿里云企业账号体系,阿里云企业账号登录名一般为:姓名@公司简称。不同公司的账号后缀是不一样的,数据也是没有打通的。

当然阿里云也支持个人账号,个人账号登录时可以使用个人邮箱和个人手机号。上面提到:纯2b的账号体系是不能用个人信息作为登录方式,否则阿里云不知道你到底登录的是哪个账号。 难道阿里云用了两套数据库表:一套用于企业账号,一套用于个人账号? 我不知道阿里云底层是怎样设计的,但我可以提出我的猜想:数据库肯定只有一套表,个人账号只是企业账号的一种特例:这个企业中只有一个人。企业信息表中有一个字段用来标识这家企业是正常的企业(多个人)还是特例的企业(一个人)。

那为什么特例企业中可以使用个人邮箱和手机号进行登录? 因为你在阿里云的个人账号只有一个,也就是说这样的特例企业只有一个,阿里云可以通过你的个人邮箱和手机号唯一查询到这家企业。

结论 面向2b的账号体现的本质是面向机构实体。先有机构再有机构用户,机构用户不能脱离于机构而存在。机构管理员拥有对机构管理员的生杀大权

上面聊了面向2b的账号模式,下面聊一下面向2c的账号模式。


面向2c的账号模式

面向2b的账号体系有一个痛点:同一个人(注意不是账号)不能在登录态中不能进切换企业。如小明登录新华社北京分社的账号后,不能直接切换登录到新华社浙江分社,必须先退出北京分社的账号后再登录浙江分社的账号。这时候小明可能会有疑问:都是我的账号,为什么不允许让我直接切换机构,还要重新登录一次,这不是纯属增添障碍吗 有这样的想法很正常,因为在现实社会中我们习惯从自身出发去思考问题。比如我在很多银行都有银行卡:建设银行、工商银行、招商银行等,虽然分布在不同的银行,但是这些银行卡都是属于我个人的。需要注意的是,在面向2b的账号体系中,你的账号并不属于你而是属于机构。你的账号是根据机构进行隔离的,所以在登录态不能切换机构。

如何你用过钉钉,你可能会问了:为什么钉钉可以在登录态中进行企业切换?难道钉钉的账号体系不是面向2b的吗? 当然我也不是钉钉员工,我也不清楚钉钉的账号体系是怎样的,但我提出我的猜想:钉钉的账号体系本质上是面向2c的账号体系。这时候你肯定想反驳:钉钉是面向企业的,它的账号体系怎么可能是面向2c的?好的,我们来回想一下,钉钉账号是谁创建的?是企业管理员吗?不,是你。是你通过个人邮箱&手机号创建的。当你创建好钉钉账号时,并没有加入任何企业,是企业管理员把你拉到企业中去的。你的钉钉账号是属于你个人的,你的账号独立于企业:既可以可以被拉到多个企业中,也可以不加入任何企业,有没有企业对你来说没有任何影响。面向2c的账号不依赖于企业,可以独立存在。 现在来解释:为什么钉钉可以在登录态切换企业?因为你登录的账号是属于你的,就算你切换企业我也知道这个账号是属于你,只不过是切换了一个企业标识而已。放在QQ的场景下,你还是你,只不过是切换了一个群,继续聊天而已。

结论 面向2c的账号体现的本质是面向个人实体。个人账号可以独立存在。个人拥有对账号的修改权限。


两种模式的比较

  1. 2b账号:面向机构实体;2c账号:面向个人实体;
  2. 2b账号:账号属于企业。对企业管理员友好,可以新开、停用企业账号;2c账号:账号属于个人。对个人友好,企业管理员不能修改个人核心信息(如登录方式),只有个人才能修改;
  3. 2b账号:企业可以方便批量新建账号。这一点在对接外部企业账号时感受非常明显;2c账号:企业只能一个一个的别人进来,不能新建;
  4. 2b账号:登录态无法在企业间进行切换;2c账号:登录态可以随意在企业间进行切换;
展开阅读全文
打赏
4
15 收藏
分享
加载中
将账号设计进行总结这点很不错, 读后思维更加清晰了.
说点琐事, 最近我们在开发一个新的分系统, 开发一阶段结束之后, 上面的领导就要求改成一个账号可以对应多个账套(也就是文中所说的机构).
当时首先想的就是文中2C这种设计方式, 因为可以切换账套. 但领导要求按照类似2B方式设计, 因为我们的产品大多是面向某个企业进行销售的.
最后当然还是按照领导说的做, 和文中不太一样的点在于, 进入(登录)这个分系统有两种途径, 主流途径是通过一个平台系统登录, 进而确定登录分系统的哪个账套, 这样, 虽然在分系统内部无法切换, 但在平台系统中可以切换进入分系统的不同账套(会话信息会被重置).
2019/12/04 08:59
回复
举报
哈哈,跟我们现在实战的思路是一样的,登录成功后生成一个ticket给用户并且让用户选择进去那个机构(系统),选择系统后通过ticket换取用户在这个机构(系统)的用户id并且生成一个登录token从而完成整个登录流程
2019/12/04 12:19
回复
举报
不完全一样,思路类似,哈哈
2019/12/04 12:21
回复
举报
“都是我的账号,为什么不允许让我直接切换机构,还要重新登录一次,这不是纯属增添障碍吗”

这个问题实际上是不成立的,这个是一个需求问题。并未账号体系本身问题。

2B的账号和2C的账号没什么太大的特殊区别,最大的特点就是 2B 账号体系通常会跟随一个授权体系。 2C的就简单的多了,只要具有某个身份就有某类权限。
2019/11/15 17:26
回复
举报
"最大的特点就是 2B 账号体系通常会跟随一个授权体系。" ------- 这点不是太明白
2019/11/15 20:05
回复
举报
类似 RBAC 这种。
2019/11/25 22:54
回复
举报
思想被面向对象的关系模型给绑死了,无论2B还是2C都是用户对资源的访问权限问题,并不矛盾。
2019/11/15 15:54
回复
举报
是的,本质上是资源的归属问题。
2019/11/15 20:09
回复
举报
只是不同的业务场景下的设计不同而已, 有点强化归类
2019/10/16 17:59
回复
举报
文章就是在讨论面向2b、2c的业务场景,当然有些观点也不完全对
2019/10/16 19:11
回复
举报
阐述很清晰,总结很准确。
2019/10/16 09:11
回复
举报
谢谢鼓励~
2019/10/16 10:02
回复
举报
更多评论
打赏
12 评论
15 收藏
4
分享
返回顶部
顶部