RESTful API 对于同一实体,如何定义管理员和用户的路径? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
kuretru
V2EX    程序员

RESTful API 对于同一实体,如何定义管理员和用户的路径?

  •  
  •   kuretru
    kuretru 2018-08-23 22:55:28 +08:00 9070 次点击
    这是一个创建于 2637 天前的主题,其中的信息可能已经有所发展或是发生改变。

    API 同时为用户及后台管理员提供接口,2 种用户都需要访问某一资源,如何优雅的定义路径,区分 2 种权限?管理员调用时字段肯定比用户调用时较多。
    例如GET /api/items获取所有物品列表,管理员可以额外获取到库存字段。

    41 条回复    2020-10-21 11:13:08 +08:00
    ksharp8
        1
    ksharp8  
       2018-08-23 22:58:36 +08:00
    管理员 api 继承用户 api,路径加 /ad
    hlwjia
        2
    hlwjia  
    PRO
       2018-08-23 23:16:58 +08:00
    我大多数项目的大多数接口用的是相同的 endpoints,只是在返回的时候根据用户身份来返回对应的内容。
    zjp
        3
    zjp  
       2018-08-23 23:24:52 +08:00 via Android
    @ksharp8 如果这样设计,不是又要考虑用户访问 /api/items/ad 和 管理员访问 /api/items/ 应该返回的字段吗
    ksharp8
        4
    ksharp8  
       2018-08-23 23:32:49 +08:00
    @kuretru 因为是继承的,所以两套功能基本一致,然后在管理员 api 里面再加点内容,返回的内容都进行加密,可以用 discuz 的加解密函数,改改参数
    hugoqin
        5
    hugoqin  
       2018-08-23 23:37:43 +08:00
    额外的参数放在 header 里
    feiyuanqiu
        6
    feiyuanqiu  
       2018-08-23 23:38:12 +08:00 via Android
    一般情况管理员和用户不会调用同一个接口,管理员在 boss 后台,用户在前台,这是两个系统,资源定义和接口路径都不一样
    lscho
        7
    lscho  
       2018-08-23 23:39:34 +08:00
    这不应该是后台处理的吗?路径保持一致,不同身份返回的数据不一样
    mec
        8
    mec  
       2018-08-23 23:44:05 +08:00 via Android
    路径一致啊
    hsluoyz
        9
    hsluoyz  
    PRO
       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 多种语言
    StevenTong
        10
    StevenTong  
       2018-08-23 23:54:46 +08:00
    我倒是觉得比较麻烦就是了。

    不过在微服务里 都会写两个 api 服务吧
    ericgui
        11
    ericgui  
       2018-08-24 03:21:42 +08:00
    同一实体就同样的 url 或 endpoint

    你内部要根据身份来确定返回什么内容
    IvanLi127
        12
    IvanLi127  
       2018-08-24 07:46:06 +08:00 via Android
    路径不作区分,后端自行根据用户凭据判断
    kuretru
        13
    kuretru  
    OP
       2018-08-24 07:49:28 +08:00 via iPhone
    @ksharp8 @hlwjia @hugoqin @ericgui @IvanLi127 感谢各位的回复
    zhzer
        14
    zhzer  
       2018-08-24 08:24:49 +08:00 via Android
    符合 restful 的还是放到 header 里,直接根据 token 判断权限
    learnshare
        15
    learnshare  
       2018-08-24 08:54:54 +08:00
    路径上没有区别,根据用户身份判断返回什么
    pipixia
        16
    pipixia  
       2018-08-24 08:57:24 +08:00 via Android
    都是人为什么加以区分?
    micean
        17
    micean  
       2018-08-24 08:57:49 +08:00
    我会定义 2 种路径,权限控制上舒服很多
    bk201
        18
    bk201  
       2018-08-24 09:05:17 +08:00
    权限不是应该后台鉴定,和前端 url 设计有什么关系?
    imlewc
        19
    imlewc  
       2018-08-24 09:16:14 +08:00 via iPhone
    2 个路由
    代码尽可能复用
    DavidNineRoc
        20
    DavidNineRoc  
       2018-08-24 09:37:27 +08:00
    首先先说明管理员和用户的区别。 如果后台也是前后台分离。 我建议直接分 url。因为这两种数据需要的根本不一样。
    如果只是单纯想实现这个功能。一般就只能加判断权限了。
    wizardoz
        21
    wizardoz  
       2018-08-24 10:16:55 +08:00
    分不同 URL 比较合理,权限只鉴定单个资源的访问权限
    iyangyuan
        22
    iyangyuan  
       2018-08-24 10:26:19 +08:00 via iPhone
    不分 url 这个会很混乱吧,首先就违反了单一职责原则
    zilan
        23
    zilan  
       2018-08-24 13:59:02 +08:00
    鉴权服务确认
    leafiy
        24
    leafiy  
       2018-08-24 14:37:14 +08:00
    1.路由鉴权,不推荐
    2.header/token,不建议
    3.区分 url,推荐
    zifangsky
        25
    zifangsky  
       2018-08-24 14:54:27 +08:00
    后台根据请求的 token 对应的用户是什么角色,来返回不同的内容。
    luozic
        26
    luozic  
       2018-08-24 16:02:11 +08:00
    这只是一个映射,具体数据内容,你可以根据账户绑定啊?
    kuretru
        27
    kuretru  
    OP
       2018-08-24 19:27:46 +08:00 via iPhone
    @DavidNineRoc @leafiy 感谢,最后使用了 2 个路径解决
    hantsy
        28
    hantsy  
       2018-08-24 19:49:01 +08:00   1
    权限和路径有什么关系???
    搞不懂这么多人支持这种脑残设计(完全不符合 REST ),专门针对不同角色定义路由 URI,如果系统有多个不同角色,要定义多个不同的 URI 吗?如果以后系统还要添加 ROLE 呢?

    @lscho @hsluoyz @zifangsky @learnshare @hlwjia @zhzer @mec 看来也有人做得不错。
    secretman
        29
    secretman  
       2018-08-24 20:26:44 +08:00 via Android
    为什么不检验 token 或者 auth 这类的来判断,加在 header 里面
    DavidNineRoc
        30
    DavidNineRoc  
       2018-08-24 20:59:22 +08:00
    @hantsy 首先楼主说的我不确定是不是这样子。
    角色和 url 无关,而楼主说的是已经不是这样子了。用户指的是前台用户,管理员是后台管理员。他们极有可能不是同一张表,你觉得他该用同一套接口,
    那么大家的后台登录为什么和前台登录不放在一起呢?
    learnshare
        31
    learnshare  
       2018-08-24 21:03:13 +08:00
    @DavidNineRoc 后台、前台甚至 App 都可以共享同一套 API,这就是前后端分离的方便之处
    lscho
        32
    lscho  
       2018-08-24 21:13:12 +08:00 via Android
    @DavidNineRoc 不是同一张表什么鬼?前台的商品和后台的商品不是同一个资源?前台登录能和后台登录相比?一个是会员,一个是管理员,不同的资源啊。
    kuretru
        33
    kuretru  
    OP
       2018-08-24 21:25:38 +08:00
    @DavidNineRoc #30 详细情况是这样的,后端 API 要同时为微信小程序和后台管理页面提供接口,信息位于同一表上,但是小程序和管理界面的请求参数、以及响应字段都不同。
    feiyuanqiu
        34
    feiyuanqiu  
       2018-08-24 21:39:30 +08:00 via Android   1
    @secretman 权限不是这么用的。
    现在权限管理一般采用 role based access control 这套方案设计,将权限管理与具体的资源、接口解耦。不同角色拥有不同的资源权限,而不是同一个资源对不同角色单独维护一套逻辑。这样满足了单一职责、开放封闭原则,对后期维护有很大好处
    newtype0092
        35
    newtype0092  
       2018-08-24 21:41:56 +08:00
    @hantsy 按 REST 风格,哪怕是同样的数据表,后台管理信息和用户展示信息根本就是两个东西,也就是两个资源,用同一个 API 访问两个资源才不符合 REST 好吧。。。
    hlwjia
        36
    hlwjia  
    PRO
       2018-08-24 22:07:58 +08:00
    最理想的是,甚至做到提供给第三方使用的 API 都是相同的一套br />
    但本人没实践过那么大型的系统 yet, 所以不知道有没有什么坑。
    secretman
        37
    secretman  
       2018-08-24 22:16:49 +08:00
    @feiyuanqiu 学习了
    DavidNineRoc
        38
    DavidNineRoc  
       2018-08-25 12:17:06 +08:00
    @learnshare 享用同一套 api 是有前提的。
    @lscho 楼主说用户管理员,没解释之前,我当然可以认为是两张表,完全不同的概念,就为了省事,加个判断返回数据,我觉得不可靠。
    @kuretru 后台也是前后端分离,直接加前缀 admin/,小程序也是后台?如果只是展示用的,我建议分开。
    jasperjia
        39
    jasperjia  
       2018-08-25 23:43:04 +08:00
    @newtype0092 你有点混淆了概念。不同资源确实应该不同 API。但是这里面还有权限的需求。你不能通过 URL 就判断该用户具有相关权限。所以还是需要 token 验证用户。当然你也可以用两个 API 承载各自业务,但是 token 或者其他验证用户身份和权限这一层必不可少。
    sanyuedev
        40
    sanyuedev  
       2020-10-21 10:03:23 +08:00
    我也有这样的疑问,很纠结
    kuretru
        41
    kuretru  
    OP
       2020-10-21 11:13:08 +08:00 via iPhone
    @sanyuedev 我现在是同一一个 url,根据携带的 Access Token 鉴别出 Role 后,返回不同的实体
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1355 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:06 PVG 01:06 LAX 09:06 JFK 12:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86