老板对公司的软件有了新的要求,他想要一个“上帝视角”的角色,可以看到所有用户数据,问我们能不能改。我说可以啊,在我们后台管理软件上写,想要什么数据我们就显示什么数据。结果他摇摇头说出了他的要求,不是在后台看,而是在前端看,我很不解,如果在用户端做这种数据权限,需要承担很大的风险,一不小心可能就会导致数据泄露!结果老板反而把我给说了一顿,说:“是你不自信还是我不自信?”
数据权限我也不是没有做过,但是我们公司的数据权限做得是真奇葩!
在我来这个公司之前,公司几乎没有权限这个概念,甚至连登录都没有,为了做权限,我这才给公司的软件加上了登录功能。
登录有了以后,老板又让我去做功能授权和数据授权,所谓的功能授权其实就是给用户分配功能页面,数据授权就是通过给对应数据加标记,让指定用户看到指定的数据。
功能授权很好改,但是,我在做数据授权的时候,公司软件的完成度已经接近80%了,要做数据授权,就要对软件的所有数据的增删改查的部分做处理,工作量不可谓不大!
花了老鼻子劲以后,我终于把功能授权和数据授权这部分做好了,结果做完以后老板说他想要管理员账户可以看到所有用户的数据。
行吧,所以,我又对所有数据的查询部分做了处理,判断查询用户是否是管理员,如果是管理员则查所有用户数据。
好吧,这样看起来,软件自用是没有问题了,但不久之后,老板说软件要对外卖,需要对权限做进一步的加强,即要分公司账号。
意思就是原本针对用户的数据权限,要在外面再加一层,先由顶级账号给公司分配功能权限和数据权限,然后每个公司下面还可以分一个管理员,公司的管理员还可以进一步分配功能权限和数据权限。
本身这么做其实一点也没问题,我说这样的话,我就得做一个后台管理软件了,老板开始不同意,非要把分配权限的功能页面做在用户端,通过判断管理员账号决定是否需要显示这个权限管理页面,我跟他解释半天他才半懂不懂得允许我做后台管理软件!
当新的权限做好以后,对应公司只能看到自己公司的数据了,此时原本管理员账户可以看到所有数据的这个逻辑变为对应的公司的管理员只能看到自己公司的全部数据。
其实,实现这个数据分配的道理很简单,那就是给每条数据加上一个公司标记,然后通过登录用户所在的公司标记来决定显示哪些数据。
此时,老板不同意了,他的要求是,他所谓的管理员,可以跳过用户检查、用户所在公司检查,可以使用所有功能和看到所有数据!
虽然老板的要求看似很合理,但是如果这样的话,几乎在所有用户端层面的增删改差接口全部得加上一个特殊判断,如果是管理员的话,就可以忽视用户检查、用户所在公司检查直接查看和操作数据!
我跟老板说,我们的公司软件如果只是小范围使用,比如说就我们公司十几个人用,他的这种做法没有问题,但是你一个即将对外收费的软件这么做权限,感觉有点怪怪的,还会让人心里不安!
老板问我此话何意,我跟老板说,一般来讲,这种可以直接操作所有数据的行为,要么就运维去做,要么就是在后台管理软件上做,在前端请求数据的时候通过用户判断用户来显示数据本身没什么问题,但是偏念要加一个“上帝视角”的角色,破除这个规则,尤其是加了一个特殊规则进去,万一(我说万一)有一天数据权限出了问题,很容易造成数据错乱,甚至有可能导致所有人都能看到对方的数据!
老板:“你这么说,是你不自信还是我不自信?”
我:“......,老板,不怕一万就怕万一啊!”
老板:“在我这里没有万一,你就说能不能做吧!”
我:“能做,能做......”
结语
对所有功能权限和数据权限加上“上帝视角”的特殊判断以后,我整个人都是提心吊胆的,我知道这里面出现问题的可能不大,但我又知道,一旦出现问题,那就是不是问题了,那就是事故了!
而且,以后看到这部分代码的程序员,我估计他们会在心里默念:“这是哪个人才写的代码!”