基于每个客户的授权策略

时间:2014-07-02 21:33:31

标签: ruby-on-rails oauth authorization pundit

我有一个Rails 4应用程序。我使用 devise 进行身份验证,使用 opro 为我的API提供oauth2。所有请求都通过 pundit 政策授权,到目前为止,此设置完全正常。

目前,我的授权始终以每用户为基础。这是有道理的,因为通常每个请求都是代表在会话中进行身份验证或通过提供oauth-token的特定用户完成的。

新的挑战是:我有一些API消费者(从现在开始我称之为设备),其请求不能被视为来自特定用户的请求。一个是可以与API交换信息的 Asterisk服务器,另一个是 GPS跟踪框,它不断将跟踪点推送到API。

因此,我需要在每台设备的基础上授权某些API操作,这意味着不一定有current_user可用。但是没有current_user搞砸了我的授权概念。

我已经考虑了几种解决问题的方法:

  • 为每个设备创建专用用户并授权他们执行特定操作
    • 亲:不搞砸我的授权方案
    • contra:意味着重新考虑User - 模型,因为目前我只有#34;自然用户"需要姓名,生日,电子邮件等
  • 使用适用的授权方案创建专用控制器
    • 亲:高度灵活性
    • 禁忌:
      • 所需设备的身份验证
      • 需要额外的API端点,感觉不是很干

我正在为这种情况寻找最佳实践方法。我相信这不是一个非常普遍的问题,必须有很好的解决方案。

1 个答案:

答案 0 :(得分:0)

您需要一个执行授权检查的单独图层以及名为caller_idcaller_type的全局属性(这些只是示例)。

然后,您想要实现一个逻辑,例如:

  • if caller_type == device and caller_id == ... then
  • if caller_type == user and caller_id == ... then

要做到这一点,你可以自定义自己的小班级代码。或者,您可以使用XACML来定义授权逻辑。请参阅此blog post,它将XACML应用于servlet。可以为您的Rails应用程序执行相同的原则。

HTH, 大卫。