API 同时为用户及后台管理员提供接口,2 种用户都需要访问某一资源,如何优雅的定义路径,区分 2 种权限?管理员调用时字段肯定比用户调用时较多。
例如GET /api/items
获取所有物品列表,管理员可以额外获取到库存字段。
1
ksharp8 2018-08-23 22:58:36 +08:00
管理员 api 继承用户 api,路径加 /ad
|
2
hlwjia 2018-08-23 23:16:58 +08:00
我大多数项目的大多数接口用的是相同的 endpoints,只是在返回的时候根据用户身份来返回对应的内容。
|
3
zjp 2018-08-23 23:24:52 +08:00 via Android
@ksharp8 如果这样设计,不是又要考虑用户访问 /api/items/ad 和 管理员访问 /api/items/ 应该返回的字段吗
|
4
ksharp8 2018-08-23 23:32:49 +08:00
@kuretru 因为是继承的,所以两套功能基本一致,然后在管理员 api 里面再加点内容,返回的内容都进行加密,可以用 discuz 的加解密函数,改改参数
|
5
hugoqin 2018-08-23 23:37:43 +08:00
额外的参数放在 header 里
|
6
feiyuanqiu 2018-08-23 23:38:12 +08:00 via Android
一般情况管理员和用户不会调用同一个接口,管理员在 boss 后台,用户在前台,这是两个系统,资源定义和接口路径都不一样
|
7
lscho 2018-08-23 23:39:34 +08:00
这不应该是后台处理的吗?路径保持一致,不同身份返回的数据不一样
|
8
mec 2018-08-23 23:44:05 +08:00 via Android
路径一致啊
|
9
hsluoyz 2018-08-23 23:50:19 +08:00
路径一样的情况下,可以通过用户的角色不同来区分权限,比如普通用户是 user 角色,管理员用户是 admin 角色,user 角色对路径只能 GET 操作,admin 角色则可以实现 POST、DELETE 等修改操作。具体实现可以使用 Casbin 权限管理库: https://github.com/casbin/casbin, 支持 Go、Java、Node.js 多种语言
|
10
StevenTong 2018-08-23 23:54:46 +08:00
我倒是觉得比较麻烦就是了。
不过在微服务里 都会写两个 api 服务吧 |
11
ericgui 2018-08-24 03:21:42 +08:00
同一实体就同样的 url 或 endpoint
你内部要根据身份来确定返回什么内容 |
12
IvanLi127 2018-08-24 07:46:06 +08:00 via Android
路径不作区分,后端自行根据用户凭据判断
|
13
kuretru OP |
14
zhzer 2018-08-24 08:24:49 +08:00 via Android
符合 restful 的还是放到 header 里,直接根据 token 判断权限
|
15
learnshare 2018-08-24 08:54:54 +08:00
路径上没有区别,根据用户身份判断返回什么
|
16
pipixia 2018-08-24 08:57:24 +08:00 via Android
都是人为什么加以区分?
|
17
micean 2018-08-24 08:57:49 +08:00
我会定义 2 种路径,权限控制上舒服很多
|
18
bk201 2018-08-24 09:05:17 +08:00
权限不是应该后台鉴定,和前端 url 设计有什么关系?
|
19
imlewc 2018-08-24 09:16:14 +08:00 via iPhone
2 个路由
代码尽可能复用 |
20
DavidNineRoc 2018-08-24 09:37:27 +08:00
首先先说明管理员和用户的区别。 如果后台也是前后台分离。 我建议直接分 url。因为这两种数据需要的根本不一样。
如果只是单纯想实现这个功能。一般就只能加判断权限了。 |
21
wizardoz 2018-08-24 10:16:55 +08:00
分不同 URL 比较合理,权限只鉴定单个资源的访问权限
|
22
iyangyuan 2018-08-24 10:26:19 +08:00 via iPhone
不分 url 这个会很混乱吧,首先就违反了单一职责原则
|
23
zilan 2018-08-24 13:59:02 +08:00
鉴权服务确认
|
24
leafiy 2018-08-24 14:37:14 +08:00
1.路由鉴权,不推荐
2.header/token,不建议 3.区分 url,推荐 |
25
zifangsky 2018-08-24 14:54:27 +08:00
后台根据请求的 token 对应的用户是什么角色,来返回不同的内容。
|
26
luozic 2018-08-24 16:02:11 +08:00
这只是一个映射,具体数据内容,你可以根据账户绑定啊?
|
27
kuretru OP @DavidNineRoc @leafiy 感谢,最后使用了 2 个路径解决
|
28
hantsy 2018-08-24 19:49:01 +08:00 1
|
29
secretman 2018-08-24 20:26:44 +08:00 via Android
为什么不检验 token 或者 auth 这类的来判断,加在 header 里面
|
30
DavidNineRoc 2018-08-24 20:59:22 +08:00
@hantsy 首先楼主说的我不确定是不是这样子。
角色和 url 无关,而楼主说的是已经不是这样子了。用户指的是前台用户,管理员是后台管理员。他们极有可能不是同一张表,你觉得他该用同一套接口, 那么大家的后台登录为什么和前台登录不放在一起呢? |
31
learnshare 2018-08-24 21:03:13 +08:00
@DavidNineRoc 后台、前台甚至 App 都可以共享同一套 API,这就是前后端分离的方便之处
|
32
lscho 2018-08-24 21:13:12 +08:00 via Android
@DavidNineRoc 不是同一张表什么鬼?前台的商品和后台的商品不是同一个资源?前台登录能和后台登录相比?一个是会员,一个是管理员,不同的资源啊。
|
33
kuretru OP @DavidNineRoc #30 详细情况是这样的,后端 API 要同时为微信小程序和后台管理页面提供接口,信息位于同一表上,但是小程序和管理界面的请求参数、以及响应字段都不同。
|
34
feiyuanqiu 2018-08-24 21:39:30 +08:00 via Android 1
@secretman 权限不是这么用的。
现在权限管理一般采用 role based access control 这套方案设计,将权限管理与具体的资源、接口解耦。不同角色拥有不同的资源权限,而不是同一个资源对不同角色单独维护一套逻辑。这样满足了单一职责、开放封闭原则,对后期维护有很大好处 |
35
newtype0092 2018-08-24 21:41:56 +08:00
@hantsy 按 REST 风格,哪怕是同样的数据表,后台管理信息和用户展示信息根本就是两个东西,也就是两个资源,用同一个 API 访问两个资源才不符合 REST 好吧。。。
|
36
hlwjia 2018-08-24 22:07:58 +08:00
最理想的是,甚至做到提供给第三方使用的 API 都是相同的一套
但本人没实践过那么大型的系统 yet, 所以不知道有没有什么坑。 |
37
secretman 2018-08-24 22:16:49 +08:00
@feiyuanqiu 学习了
|
38
DavidNineRoc 2018-08-25 12:17:06 +08:00
@learnshare 享用同一套 api 是有前提的。
@lscho 楼主说用户管理员,没解释之前,我当然可以认为是两张表,完全不同的概念,就为了省事,加个判断返回数据,我觉得不可靠。 @kuretru 后台也是前后端分离,直接加前缀 admin/,小程序也是后台?如果只是展示用的,我建议分开。 |
39
jasperjia 2018-08-25 23:43:04 +08:00
@newtype0092 你有点混淆了概念。不同资源确实应该不同 API。但是这里面还有权限的需求。你不能通过 URL 就判断该用户具有相关权限。所以还是需要 token 验证用户。当然你也可以用两个 API 承载各自业务,但是 token 或者其他验证用户身份和权限这一层必不可少。
|
40
sanyuedev 2020-10-21 10:03:23 +08:00
我也有这样的疑问,很纠结
|