问题标签 [cancan]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1711 浏览

ruby-on-rails - CanCan、InheritedResources 和 STI

如何同时使用 cancan、inherited_resources 和单表继承?我有类似这个例子的代码:

当我以用户身份尝试创建人时,我得到 CanCan::AccessDenied。那是因为 InheritedResources 使用 Contact 作为 :resource_class。

0 投票
1 回答
9469 浏览

ruby-on-rails - Cancan access_by

当我这样做时到底发生了什么:

似乎发生的事情是我得到 course_enrollments where course.client_id = user.client.id,我只是不明白它是如何accessible_by工作的。

0 投票
2 回答
3440 浏览

ruby-on-rails - 允许匿名/访客用户“试用”功能而无需在 Rails/Devise/CanCan 应用程序中注册

我正在使用 Devise 和 CanCan 开发 Rails 3 应用程序。

该应用程序允许匿名(未注册)用户访问该应用程序的某些部分,并允许注册用户访问其他部分。

该应用程序(一个瑜伽锻炼应用程序)的一个方面是用户可以通过将瑜伽姿势串在一起来创建瑜伽序列,然后他们可以在视频播放器中播放它们。

我目前拥有注册用户的所有功能,但现在希望允许匿名用户能够创建一个序列并播放它,但要“保存”它(即能够在任何后续会话中再次使用它) ,他们需要注册。

目前,这需要实际创建一个序列模型实例,它属于一个用户(下面简化)

但是,当然,匿名用户没有用户模型。

我已经破解了序列确实属于用户的一些东西,但它不是强制性的(user_id 可以是 nil,如上所示),并且编辑能力通过 CanCan 得到保护:

但是,这意味着任何匿名用户(user_id = nil)都可以编辑任何其他匿名用户的序列。我想这不是世界末日,但是,我希望它更安全。

以下是我想到的潜在方法:

“注册”匿名用户

  • 如果来宾用户去制作序列,则生成电子邮件和密码并“注册”这个“来宾”用户。然后将新的序列模型分配给这个新用户。如果用户决定进行真实注册,只需使用新的电子邮件和密码更新现有用户记录。
  • 优点:对现有应用的改动很少——只需要在“注册”过程中处理即可。
  • 缺点:最终可能会导致我需要清理大量死用户帐户

不要持久化序列,而是将其序列化并存储在会话中

  • 如果来宾用户去制作一个序列,当他们想要“保存”它时,将它发送到一个控制器方法,该方法序列化模型并将其存储在会话中。然后,序列播放器,我猜,序列编辑器可以选择从会话而不是数据存储中提取它
  • 优点:无需为客人创建用户帐户,因此无需清理。无需处理修改 Abilities,因为来宾不会从 Datastore 中获取模型,而是从他们的会话中获取模型。
  • 缺点:看起来很hacky。将需要应用程序中的大量接触点来确定从何处获取序列。更高的错误可能性

找出将序列分配给来宾用户的其他方法,而不是将 user_id 设为 nil

  • 优点:会很精彩
  • 缺点:不知道该怎么做。

我希望有一些我在 Devise 中没有看到的东西(也许是邀请的?),然后我自己滚动它会更干净。

或者,有人对这个问题有什么建议吗?这似乎是一个相对普遍的要求,但无法挖掘出任何指导。

谢谢!

0 投票
1 回答
949 浏览

ruby-on-rails - 继承资源和 CanCan 3 级嵌套

我对 CanCan 中模型的 3 层嵌套和继承资源有疑问。我读过我们应该将所有内容嵌套到 2 个级别,但我必须将所有内容都放在account模型下,现在我尝试在 CanCan 中这样做:

这给了我一个值为@project 的@account 变量,就像它正在覆盖它一样。@project 是应该的,@model 也是。是我的错,CanCan 的,继承的资源还是 CanCan 不支持 3 级嵌套?另外,我在 IR 中为 ModelsController 执行此操作。

另一个奇怪的事情是当我load_and_从 CanCan 的定义中删除部分时。然后它可以工作,但我读过不使用该load部件可能很危险。

我可以只authorize_resource使用 CanCan 还是应该使用 CanCan?

0 投票
1 回答
493 浏览

ruby-on-rails - 有什么方法可以订购 Cancan access_by 调用的结果

我正在使用 Cancanaccessible_by来检索 ActiveRecord::Relation 结果(下面的示例代码)。有没有办法在accessible_by通话期间订购结果?

更新:Srdjan 是正确的。@attributes已经使用accessible_by. 我更新了示例以显示按用户登录的排序。Attribute与 有belongs_to关系User

0 投票
1 回答
828 浏览

ruby-on-rails - CanCan 复杂能力定义

我有一个任务对象。

任务属于用户或公司。

一个用户可以通过雇佣关系属于许多公司(如区域经理)。

有没有一种方法可以让我与 cancan 进行检查以查看任务是属于用户还是属于他们所属的公司之一?

IE

0 投票
2 回答
5226 浏览

ruby-on-rails - 如何使用 cancan 对资源数组进行授权?

我有一个我正在尝试使用 cancan 授权的 non-restful 控制器!应用权限的方法。

我有一个这样开始的 delete_multiple 动作

我想在继续之前检查用户是否有权删除所有这些发票。如果我使用

许可被拒绝。我的能力.rb 包括以下内容

是循环遍历我的数组并单独调用授权的问题,还是有更聪明的做事方式?我开始觉得手动进行授权比将 cancan 用于复杂的 non-restful 控制器更容易(尽管我的应用程序中有很多其他的 restful 控制器,它们都很好用)。

0 投票
1 回答
268 浏览

ruby-on-rails-3 - Rails 3 中的授权依赖于变量(不仅是用户和当前资源)

我使用过 cancan 并且我知道声明式授权,但似乎它们并没有让角色有机会依赖自定义变量。

楷模:

  • 域(blah.qwe.com、wer.qwe.com、ert.qwe.com)- 我需要它们在一个数据库和应用程序中。

  • 用户(可以有多个角色)

  • 角色(每个角色只在其领域内有效;能力是可编辑的)

  • ...

例如,我有一个用户,他是 blah.qwe.com 域的所有者,但他是 wer.qwe.ru 和 ert.qwe.com 的简单用户,他被禁止了,什么也做不了。

@current_domain 被加载到应用程序控制器的 before_filter 中(通过 current_domain 方法),而 current_user 被 devise 加载。使授权依赖于当前请求的资源(如在 cancan 中)、current_user 和 current_domain(可能还有其他 before_filter 加载的变量)的解决方案是什么?cancan 中是否有解决方案,或者我应该修改它或编写自己的自定义授权系统?

0 投票
2 回答
5243 浏览

cancan - 大礼包自定义角色权限

我正在尝试在特定权限内提供一些自定义角色。在任何地方都找不到这个答案

角色能力.rb

我认为这可能是一个流行的想法,让具有“经理”角色的用户仅管理产品和其他某些模型......

如果我改变

它按预期工作......我可以访问所有管理区域

我只希望“零售商”能够:管理产品!;)

“admin”只是一个与用户关联的角色,即所有角色都是用户。

您可能会看到它的发展方向,零售商可以注册并销售他们自己的商品......这就是目标。

任何指针?

0 投票
1 回答
1459 浏览

ruby-on-rails - CanCan 嵌套资源控制器授权

在我的应用程序中,允许用户指定另一个用户作为他们的“客户经理”,并且允许客户经理修改所有用户信息。我定义了以下能力:

用户也有一些嵌套资源(例如:出版物)。我定义了以下能力:

在视图中,我使用以下内容进行检查:
can? :update, @publication, @user_we_are_accessing
can? :create, Publication.new, @user_we_are_accessing.

到目前为止一切正常。我的问题是控制器。在我的 PublicationsController 中,我添加了:
load_and_authorize_resource :user
load_and_authorize_resource :publication, :through => :user

然而,这总是抛出 AccessDenied,因为发布检查没有将用户对象传递给能力(试图检查能力中的用户对象显示为零)。

有什么想法可以实施吗?

tl;dr:使用 CanCan 授权对资源的访问。用户可以指定另一个用户作为客户经理。用户有嵌套资源。问题:客户经理无法访问嵌套资源。