ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 基于用户角色RESTful路由API

2019-06-24 07:46:03  阅读:270  来源: 互联网

标签:json python rest flask flask-restful


我正在使用Flask-RESTful开发API,我的应用程序有三个角色.

> site_admin
> department_admin
>基本的

对于任何给定资源,返回的JSON对象具有基于每个角色的不同密钥集.

例如,如果您将/ orders命中为“site_admin”,结果可能如下所示:

{
  "orders": [
    {"id": 1, "user": "foo", "paid": True,  "department": "A", "code": 456},
    {"id": 2, "user": "bar", "paid": False, "department": "A", "code": 567},
    {"id": 3, "user": "meh", "paid": False, "department": "B", "code": 678}
  ]
}

但是,如果您将/ orders命中为“department_admin”,结果可能如下所示:

{
  "orders": [
    {"id": 3, "user": "meh", "paid": False}
  ]
}

如果你点击/命令为“基本”,这将是一个非常小的JSON响应,如下所示:

{
  "orders": [
    {"id": 2, "paid": True}
  ]
}

实现这个的RESTful方式是什么?

我可以想出三种方法.

(1)使用请求arg并对其进行过滤:

class Orders(restful.Resource):
  def get(self):
    if request.args['role'] == 'site_admin':
      return admin_JSON_response()
    elif request.args['role'] == 'department_admin':
      return dept_admin_JSON_response()
    else:
      return basic_JSON_response()

api.add_resource(Orders, '/orders')

(2)对会话对象进行过滤:

class Orders(restful.Resource):
  def get(self):
    if session['role'] == 'site_admin':
      return admin_JSON_response()
    elif session['role'] == 'department_admin':
      return dept_admin_JSON_response()
    else:
      return basic_JSON_response()

api.add_resource(Orders, '/orders')

(3)每个角色的路线不同:

class OrdersSiteAdmin(restful.Resource):
  def get(self):
    return admin_JSON_response()
api.add_resource(OrdersSiteAdmin, '/orders_site_admin')

class OrdersDeptAdmin(restful.Resource):
  def get(self):
    return dept_admin_JSON_response()
api.add_resource(OrdersDeptAdmin, '/orders_dept_admin')

class OrdersBasic(restful.Resource):
  def get(self):
      return basic_JSON_response()
api.add_resource(OrdersBasic, '/orders_basic')

……对于RESTful的首选方式,是否存在共识?

非常感谢!

解决方法:

您的选项#2违反了“无状态”约束,在REST API中使用用户会话不是一个好主意,而是应该要求您的客户端为每个请求提供身份验证.

假设您修复了#2而不是用户会话,您现在拥有一个current_user变量,该变量在身份验证期间填充.然后你可以重写这个例子如下:

class Orders(restful.Resource):
  def get(self):
    if current_user.role == 'site_admin':
      return admin_JSON_response()
    elif current_user.role == 'department_admin':
      return dept_admin_JSON_response()
    else:
      return basic_JSON_response()

api.add_resource(Orders, '/orders')

让我们一个一个看看你的三个选项:

>(1)指定查询字符串中的角色,只需传递所需的角色,即可使任何用户请求任何表示.但为什么要把角色放在查询字符串中呢?我假设您将对您的用户进行身份验证,因此了解您的用户您也了解该角色.这似乎是不必要的,将为您提供额外的验证工作.
>(3)为每个角色创建不同的资源.再一次,您必须确保“基本”用户无权访问适用于较高角色的两个URL,因此您还需要进行一些验证工作.
>(2)假设用户数据库存储每个用户的角色,因此一旦用户通过身份验证,就会根据分配的角色返回其角色的正确表示.我认为这是最好的选择,因为用户真的无法破解他们不允许看到的数据.

说到RESTful,我还会看一下你的陈述,这些陈述可以改进.考虑实施指向其他资源的链接,而不是提供ID,以符合HATEOAS约束.

标签:json,python,rest,flask,flask-restful
来源: https://codeday.me/bug/20190624/1276446.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有