如何以RESTfull方式处理已登录用户的Django后端请求?

时间:2019-05-20 09:25:47

标签: django rest django-rest-framework django-authentication

我正在开发一个Web平台,该平台可为特定软件提供许可证处理(例如,创建,开发票,下载)。后端是django 2.1.7,前端是有角度的。

我有以下用例,我想确保它尊重REST体系结构,并且它是未来的证明(避免陷阱)。

所以我有2个api:

  • ip /用户个人资料
  • ip /许可证

这2个api受保护,只有登录后才能访问。

在我当前的实现中,这2个api的GET请求通过从request.user(对于经过身份验证的用户)信息中提取用户ID和名称来返回仅针对登录用户的特定数据。

GCDWebServerDataResponse responseWithHTML:

另一个用例是,管理员应该有权访问所有许可证和所有用户,为此,我进行检查以查看request.user是否为管理员。

User with user1 name logged in (NOT admin).
GET ip/userprofiles will return user1 profile.
GET ip/licences will return user1 licences.

对于管理员用户,api还允许用户使用查询字符串参数进行过滤。

从REST角度和从安全角度来看,这种方法是否可行?我应该注意的陷阱吗?

对于非管理员用户,我是否也应使用​​与管理员用户相同的方法,即在前端中将当前用户ID指定为查询字符串参数,而不是从request.user(经过身份验证的用户)中提取后端用户信息)? 对于我来说,此解决方案似乎并不安全,但可能是对将来的限制(尽管目前我看不到任何用户可以访问其他用户许可证和配置文件的用例)

1 个答案:

答案 0 :(得分:1)

我个人不同意你在说什么。每个API端点对每个请求操作应负一个责任。 ip/userprofiles处的GET请求应始终返回单个对象或对象列表。这简化了客户的逻辑,因此可以一致地转换结果。

这是我的建议:

# Detail / Single Object Endpoints:
ip/userprofile
ip/license

无论管理员身份如何,这两个总是分别返回当前用户的配置文件和许可证。

# List Endpoints
ip/userprofiles
ip/licenses

这两个总是分别返回用户和许可证的列表,但是会有一些验证(在DRF中为权限类),只有在request.user是管理员时才返回数据。如果用户不是管理员,则会返回403错误。