• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kuretru
V2EX  ›  程序员

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

  •  
  •   kuretru ·
    kuretru · Aug 23, 2018 · 9482 views
    This topic created in 2833 days ago, the information mentioned may be changed or developed.

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

    41 replies    2020-10-21 11:13:08 +08:00
    ksharp8
        1
    ksharp8  
       Aug 23, 2018
    管理员 api 继承用户 api,路径加 /ad
    hlwjia
        2
    hlwjia  
    PRO
       Aug 23, 2018
    我大多数项目的大多数接口用的是相同的 endpoints,只是在返回的时候根据用户身份来返回对应的内容。
    zjp
        3
    zjp  
       Aug 23, 2018 via Android
    @ksharp8 如果这样设计,不是又要考虑用户访问 /api/items/ad 和 管理员访问 /api/items/ 应该返回的字段吗
    ksharp8
        4
    ksharp8  
       Aug 23, 2018
    @kuretru 因为是继承的,所以两套功能基本一致,然后在管理员 api 里面再加点内容,返回的内容都进行加密,可以用 discuz 的加解密函数,改改参数
    hugoqin
        5
    hugoqin  
       Aug 23, 2018
    额外的参数放在 header 里
    feiyuanqiu
        6
    feiyuanqiu  
       Aug 23, 2018 via Android
    一般情况管理员和用户不会调用同一个接口,管理员在 boss 后台,用户在前台,这是两个系统,资源定义和接口路径都不一样
    lscho
        7
    lscho  
       Aug 23, 2018
    这不应该是后台处理的吗?路径保持一致,不同身份返回的数据不一样
    mec
        8
    mec  
       Aug 23, 2018 via Android
    路径一致啊
    hsluoyz
        9
    hsluoyz  
    PRO
       Aug 23, 2018
    路径一样的情况下,可以通过用户的角色不同来区分权限,比如普通用户是 user 角色,管理员用户是 admin 角色,user 角色对路径只能 GET 操作,admin 角色则可以实现 POST、DELETE 等修改操作。具体实现可以使用 Casbin 权限管理库: https://github.com/casbin/casbin, 支持 Go、Java、Node.js 多种语言
    StevenTong
        10
    StevenTong  
       Aug 23, 2018
    我倒是觉得比较麻烦就是了。

    不过在微服务里 都会写两个 api 服务吧
    ericgui
        11
    ericgui  
       Aug 24, 2018
    同一实体就同样的 url 或 endpoint

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

    @lscho @hsluoyz @zifangsky @learnshare @hlwjia @zhzer @mec 看来也有人做得不错。
    secretman
        29
    secretman  
       Aug 24, 2018 via Android
    为什么不检验 token 或者 auth 这类的来判断,加在 header 里面
    DavidNineRoc
        30
    DavidNineRoc  
       Aug 24, 2018
    @hantsy 首先楼主说的我不确定是不是这样子。
    角色和 url 无关,而楼主说的是已经不是这样子了。用户指的是前台用户,管理员是后台管理员。他们极有可能不是同一张表,你觉得他该用同一套接口,
    那么大家的后台登录为什么和前台登录不放在一起呢?
    learnshare
        31
    learnshare  
       Aug 24, 2018
    @DavidNineRoc 后台、前台甚至 App 都可以共享同一套 API,这就是前后端分离的方便之处
    lscho
        32
    lscho  
       Aug 24, 2018 via Android
    @DavidNineRoc 不是同一张表什么鬼?前台的商品和后台的商品不是同一个资源?前台登录能和后台登录相比?一个是会员,一个是管理员,不同的资源啊。
    kuretru
        33
    kuretru  
    OP
       Aug 24, 2018
    @DavidNineRoc #30 详细情况是这样的,后端 API 要同时为微信小程序和后台管理页面提供接口,信息位于同一表上,但是小程序和管理界面的请求参数、以及响应字段都不同。
    feiyuanqiu
        34
    feiyuanqiu  
       Aug 24, 2018 via Android   ❤️ 1
    @secretman 权限不是这么用的。
    现在权限管理一般采用 role based access control 这套方案设计,将权限管理与具体的资源、接口解耦。不同角色拥有不同的资源权限,而不是同一个资源对不同角色单独维护一套逻辑。这样满足了单一职责、开放封闭原则,对后期维护有很大好处
    newtype0092
        35
    newtype0092  
       Aug 24, 2018
    @hantsy 按 REST 风格,哪怕是同样的数据表,后台管理信息和用户展示信息根本就是两个东西,也就是两个资源,用同一个 API 访问两个资源才不符合 REST 好吧。。。
    hlwjia
        36
    hlwjia  
    PRO
       Aug 24, 2018
    最理想的是,甚至做到提供给第三方使用的 API 都是相同的一套

    但本人没实践过那么大型的系统 yet, 所以不知道有没有什么坑。
    secretman
        37
    secretman  
       Aug 24, 2018
    @feiyuanqiu 学习了
    DavidNineRoc
        38
    DavidNineRoc  
       Aug 25, 2018
    @learnshare 享用同一套 api 是有前提的。
    @lscho 楼主说用户管理员,没解释之前,我当然可以认为是两张表,完全不同的概念,就为了省事,加个判断返回数据,我觉得不可靠。
    @kuretru 后台也是前后端分离,直接加前缀 admin/,小程序也是后台?如果只是展示用的,我建议分开。
    jasperjia
        39
    jasperjia  
       Aug 25, 2018
    @newtype0092 你有点混淆了概念。不同资源确实应该不同 API。但是这里面还有权限的需求。你不能通过 URL 就判断该用户具有相关权限。所以还是需要 token 验证用户。当然你也可以用两个 API 承载各自业务,但是 token 或者其他验证用户身份和权限这一层必不可少。
    sanyuedev
        40
    sanyuedev  
       Oct 21, 2020
    我也有这样的疑问,很纠结
    kuretru
        41
    kuretru  
    OP
       Oct 21, 2020 via iPhone
    @sanyuedev 我现在是同一一个 url,根据携带的 Access Token 鉴别出 Role 后,返回不同的实体
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   962 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 141ms · UTC 19:45 · PVG 03:45 · LAX 12:45 · JFK 15:45
    ♥ Do have faith in what you're doing.