【问题标题】:Authorization strategy on a per-client basis基于每个客户的授权策略
【发布时间】:2014-07-02 21:33:30
【问题描述】:

我有一个 Rails 4 应用程序。我使用 devise 进行身份验证,使用 opro 为 oauth2 提供我的 API。所有请求都通过 pundit 策略授权,直到现在,这个设置都很好。

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

新的挑战是:我有某些 API 消费者(从现在开始我将它们称为设备),他们的请求不能被视为来自特定用户的请求。一种是Asterisk Server,可以与API 交换信息,另一种是GPS Tracking Box,不断向API 推送跟踪点。

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

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

  • 为每个设备创建专用用户并授权他们执行特定操作
    • 亲:不会搞砸我的授权方案
    • 相反:意味着重新考虑User-Model,因为目前我只有需要姓名、生日、电子邮件等的“自然用户”
  • 使用经过调整的授权方案创建专用控制器
    • 专业:高灵活性
    • 相反:
      • 需要对设备进行身份验证
      • 需要额外的 API 端点,感觉不是很干燥

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

【问题讨论】:

    标签: ruby-on-rails oauth authorization pundit


    【解决方案1】:

    您需要一个单独的层来执行授权检查以及称为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, 大卫。

    【讨论】:

    • 感谢您的建议,但让我问一些细节。不久前我考虑过 XACML,但我觉得目前还没有很好的 rails 实现。因此,我使用 Pundit gem 实现了授权,并且效果很好。关于您提到的“单独层”,您是指多态用户模型之类的东西,例如拥有一个通用的User 模型和更具体的NaturalUserDeviceUser,然后对通用基类进行授权?还是建议添加中间件?
    • 关于分离层,我的意思是把 authZ 代码从业务逻辑中分离出来。如果您使用 pundit gem,那么您已经在这样做了。恕我直言,使用然后扩展的通用 User 类很有意义。我不知道有任何 RoR XACML 实现,但如果你有办法从 Ruby 调用 XACML 引擎,这并不重要,对吧? Axiomatics - 我工作的供应商 - 提供了一个 API,以便您可以从包括 Ruby 在内的多种语言调用 XACML 引擎。
    猜你喜欢
    • 2016-05-20
    • 2020-02-16
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2019-06-25
    • 2018-12-28
    • 2023-01-20
    • 2020-09-23
    相关资源
    最近更新 更多