【问题标题】:Rails REST API permissions (CanCan) with Angular JS client. How to render UI based on permissions?带有 Angular JS 客户端的 Rails REST API 权限 (CanCan)。如何根据权限呈现 UI?
【发布时间】:2014-07-21 06:15:06
【问题描述】:

我正在构建一个只能通过 JSON API(Rails 4.0,PostgreSQL)工作的项目。这是一个具有基于数据库权限的大型应用程序。而且我有 AngularJS 应用程序可以与这个 REST API 一起使用。

简化结构:

employees >--- position ---< permission

员工.rb

belongs_to :position

位置.rb

has_many :employees
has_many :permissions, dependent: :destroy

权限.rb

belongs_to :position
## Columns
 # action (:manage, :read, :update, :create, etc...)
 # subject_class
 # subject

AngularJS 客户端的操作按钮/链接有问题。

例如,我不想在 Angular 应用程序的某处显示链接“添加订单”,因为员工的职位权限只允许读取资源而不是修改它:

id    action     subject_class     subject
 1    :read      Order            

我是如何解决这个问题的

我创建了一个资源 GET api/v1/employees/me,它返回 current_employee 及其所有权限:

"employee": {
    ...
    :position": {
        ...
        "permissions": {
           {"id": 1, "action": "read", "subject_class": "Order", "subject": ""},
           {"id": 6, "action": "manage", "subject_class": "Waybill", "subject": ""}
        }
     }
  }

所以我在客户端拥有所有权限,但是将收到的权限与 AngularJS 应用程序 UI 完美集成的最佳方式是什么?

【问题讨论】:

标签: javascript ruby-on-rails ruby angularjs rest


【解决方案1】:

经过一番挖掘,我想我找到了一个可行的解决方案。这是您的方法与上面 Jon Samwell 评论的结合:

http://jonsamwell.com/url-route-authorization-and-security-in-angular/

和 Eric Zou 的博文:

http://blog.ericzou.com/2013/05/03/using-angularjs-for-existing-rails-app/

总结一下:

  • 创建一个rails服务,以json格式响应rails端当前用户的cancanabilities。看起来这就是您开始使用 GET 请求权限所做的事情。像这样(来自 Eric 的博客)为当前用户调用 /abilities.json 时:
{
  "manage": {
    "User": true,
    "Post": false,
    ...
  },
  "read": {
    "User": true,
    "Post": true
    ...
  },
  "Update": {
    "User": true,
    "Post": false
  }
  ...
}

要获得特定用户的能力,您可以在控制器中执行Ability.new(current_user) 之类的操作。它返回一个带有一堆规则的对象。规则有条件允许您限制对特定帖子的访问。

  • 创建一个 Angular 服务来处理解析,该解析作为您从 Rails 端获得的内容之间的抽象层(确定您是否可以访问路线或是否可以管理、读取等特定模型(例如,可以?(:manage, post) )。您可以根据需要使这项服务变得复杂。

  • 还可以在 Angular 中创建一个指令来处理要显示的内容。 Eric 建议使用 ng-show 来做到这一点,这很好,但是用类似于 Jon 的建议的东西来清理它:&lt;div access="post" access-type="read" access-options="options"&gt;Secret Post&lt;/div&gt; 对我来说很有意义。

确保您不会从服务器提供任何您不希望用户在他们入侵您的 javascript 以更改其权限后看到的内容。这不是安全,而是 UI 管理。

【讨论】:

  • 好主意!我会试试的。
猜你喜欢
  • 2020-02-21
  • 2019-02-27
  • 2012-02-14
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多