假如有一个应用,涉及到部门、人员等实体,部门是树状的,人员归属于部门。
部门经理可以查看自己部门(包括下属部门)的所有用户,那么在提供用户查询这个 api 的时候有两种方式:
1 /api/user
不带参数,后台自动根据当前登陆角色查询出有权限查看的用户,比如系统管理员返回所有,部门经理返回当前部门人员,相当于根据身份在进行 sql 查询的时候增加额外的过滤语句。
2 /api/user?department=xxx
需要前端显式提供部门 id 之类,后台对当前登陆角色的部门跟查询部门进行校验,然后根据提供的部门 id 去查询。
那种更优呢?
另外,顺便问一下:
3 管理员这种角色是分配到根部门还是设置为 null ?
1
bnm965321 2020-04-27 09:48:46 +08:00
1 好一点,2 的话首先需要用户知道自己是哪个 /哪几个部门,然后如果 department id 不对应,后端也应该返回 403,绕了好大一个弯。
API 的幂等性,指的是相同的输入得到相同的输出。我觉得不同类型的用户也应该算作是不同的输入。 |
2
kaneg 2020-04-27 09:56:37 +08:00 via iPhone
我觉得 1 和 2 不冲突。查询的最终结果是由权限和查询条件共同作用生成的。1 和 2 只是查询过滤条件不同。1 )代表在自己权限范围内查看自己能看得所有用户,2 )代表在权限范围内查看指定的部门,但很有可能这个部门的人自己一个都没权限看。
至于权限和过滤条件如何在实现层面共同起作用,就要看你用的是什么样的权限框架,比如 RBAC 。 |