Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Rails REST API权限(CanCan)与Angular JS客户端。如何基于权限呈现UI?_Javascript_Ruby On Rails_Ruby_Angularjs_Rest - Fatal编程技术网

Javascript Rails REST API权限(CanCan)与Angular JS客户端。如何基于权限呈现UI?

Javascript Rails REST API权限(CanCan)与Angular JS客户端。如何基于权限呈现UI?,javascript,ruby-on-rails,ruby,angularjs,rest,Javascript,Ruby On Rails,Ruby,Angularjs,Rest,我正在构建一个只通过JSON API(Rails 4.0,PostgreSQL)工作的项目。这是一个具有基于数据库权限的大型应用程序。我有一个AngularJS应用程序,它与这个RESTAPI一起工作 简化结构: employees >--- position ---< permission Position.rb has_many :employees has_many :permissions, dependent: :destroy Permission.rb belong

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

简化结构:

employees >--- position ---< permission
Position.rb

has_many :employees
has_many :permissions, dependent: :destroy
Permission.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
,它返回当前拥有所有权限的员工:

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

因此,我拥有客户端的所有权限,但与AngularJS应用程序UI进行漂亮集成的最佳方式是什么?

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

以及Eric Zou的博文:

总结如下:

  • 创建一个rails服务,以json格式响应rails端当前用户的cancan
    能力。看起来这就是您开始对GET权限请求执行的操作。在为当前用户调用/abilities.json时,如下所示(来自Eric的博客):
要获得特定用户的能力,您可以在控制器中执行类似于
Ability.new(当前用户)
的操作。它返回一个包含一系列规则的对象。这些规则有一些条件,允许您限制对特定帖子的访问

  • 在angular中创建一个处理解析的服务,该解析作为从rails端获得的内容之间的抽象层工作(确定您是否可以访问路由,或者是否可以管理、读取特定模型(例如,can?(:manage,post))等)。您可以根据需要将此服务复杂化

  • 另外,在angular中创建一个指令来处理要显示的内容。Eric建议使用ng show来执行此操作,这很好,但是使用类似于Jon建议的方法来清理它:
    秘密帖子
    对我来说很有意义


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

我写了一篇博客文章,解释了如何做这类事情。好主意!我将尝试一下。
"employee": {
    ...
    :position": {
        ...
        "permissions": {
           {"id": 1, "action": "read", "subject_class": "Order", "subject": ""},
           {"id": 6, "action": "manage", "subject_class": "Waybill", "subject": ""}
        }
     }
  }
{
  "manage": {
    "User": true,
    "Post": false,
    ...
  },
  "read": {
    "User": true,
    "Post": true
    ...
  },
  "Update": {
    "User": true,
    "Post": false
  }
  ...
}