Javascript Rails REST API权限(CanCan)与Angular JS客户端。如何基于权限呈现UI?
我正在构建一个只通过JSON API(Rails 4.0,PostgreSQL)工作的项目。这是一个具有基于数据库权限的大型应用程序。我有一个AngularJS应用程序,它与这个RESTAPI一起工作 简化结构: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
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
我是如何解决这个问题的
我创建了一个资源GETapi/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
}
...
}