V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kuretru
V2EX  ›  程序员

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

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

    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  
       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  
       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  
       2018-08-24 22:07:58 +08:00
    最理想的是,甚至做到提供给第三方使用的 API 都是相同的一套

    但本人没实践过那么大型的系统 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   ·   实用小工具   ·   5987 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 02:55 · PVG 10:55 · LAX 18:55 · JFK 21:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.