使用 CanCan 进行上下文感知授权

2024-01-18

我想使用 CanCan 来处理我的权限。我的网站有许多不同的权限级别,其中大多数都是上下文感知的。例如,以下是我的 3 个主要模型中的关系:

class User < ActiveRecord::Base
  has_many :league_relations
  has_many :leagues, :through => :league_relations
end

class League < ActiveRecord::Base
  has_many :league_relations
  has_many :users, :through => :league_relations
end

class LeagueRelation < ActiveRecord::Base
  belongs_to :user
  belongs_to :league
end

请注意,LeagueRelations 是 Leagues 的嵌套资源。我想要做的是允许用户修改联赛,并根据 league_relation 中存储的数据评估每个用户的授权。然后,我希望用户仅根据用户模型中存储的数据来修改联赛关系。

简而言之:我基本上希望使用 LeagueRelations 来授权 League 操作,并使用 Users 来授权 LeagueRelations 操作。即 league_relation.owner = true 删除联赛,但 user.owner?必须为 true 才能删除 LeagueRelation。如何在联盟控制器内部根据 league_relation 的属性进行授权,并在其他模型上的其他控制器中授权其他操作。如果您需要更多说明,请发表评论。

Thanks.


好的,我解决了问题。 CanCan 自述文件的开头简要提到了我的用例,但我错过了。您可以在 app/models/ 中定义新的能力类,该类接受除 current_user 之外的不同参数。为此,您将以下内容放入控制器中:

def current_ability 
  if params[:controller] == 'leagues'
    @current_ability = LeagueAbility.new(current_user_league_relation)
  elsif params[:controller] == 'league_relations'
    @current_ability = LeagueRelationAbility.new(current_user_league_relation)
  else
    @current_ability = Ability.new(current_user)
  end
end

现在您可以在 app/models/ 中创建 league_ability.rb。

class LeagueAbility
  include CanCan::Ability

  def initialize(league_relation)
    league_relation ||= LeagueRelation.new

    if league_relation.owner?
      can :manage, League, :id => league_relation.league_id
    elsif league_relation.moderator?
      can :manage, League, :id => league_relation.league_id
      cannot [:delete, :destroy], League
    else
      can :read, League
      can :create, League
    end    
  end
end

需要注意的一件事是,这依赖于您的应用程序控制器调用子类中的方法。希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CanCan 进行上下文感知授权 的相关文章

随机推荐

  • Python 帮助:从 csv 文件创建 {str:list of str} 的字典

    我必须创建一个以下格式的表 str list of str 使用以下代码打开 csv 文件 我得到 import csv cr csv reader open name csv r for row in cr print row outpu
  • 如何从 PHP 发送带有标头的 GET 请求?

    如果这是一个重复的问题 请告诉我 但这开始变得荒谬了 我想用 PHP GET http www example com hello xyz 并将此标头添加到请求中 X Header Name foobar 其中 foobar 来自已定义的
  • 在java中将字符串转换为整数的最有效方法

    将 String 对象转换为 Integer 对象的方法有很多种 以下哪一个是最有效的 Integer valueOf Integer parseInt org apache commons beanutils converters Int
  • 删除 PDF 输出中条形周围的空格

    我有一个条形图 gt data c 1 5 3 4 gt barplot data space 0 col gray border 0 在 OS X 上 使用默认驱动程序 Quartz 如下所示 注意如何有no条之间的空间 但是 将图形导出
  • CBPeripheral 存储的 UUID 对于重新连接有效多长时间? [复制]

    这个问题在这里已经有答案了 我一直在使用 Corebluetooth 并且了解到 除了每次想要连接时都要经历扫描外围设备的繁琐过程之外 我还可以存储外围设备的 UUID 并将其与retrievePeripheralsWithIdentifi
  • python中多个数组的相加

    我有许多数组 我希望使用加法将它们广播到单个数组中 我知道可以简单地这样做 a numpy array 1 2 3 b numpy array9 4 5 6 sum a b print sum 5 7 9 但是 我无法像这个简单的示例一样对
  • HashMap get/put 复杂性

    我们习惯说HashMap get put操作是 O 1 然而 这取决于哈希实现 默认的对象哈希实际上是 JVM 堆中的内部地址 我们确信这样的说法就足够好了吗 get put是 O 1 可用内存是另一个问题 据我从 javadocs 了解到
  • 请求中添加请求参数

    我需要在一个kernel event listener在阶段kernel controller为了做某事kernel response 听众 我考虑过添加一个参数 request对象 但是没有找到任何方法或这个 http api symfo
  • Node.js:如何附加到正在运行的进程并使用控制台调试服务器?

    我使用 永远 来运行我的应用程序 我想附加到运行环境来检查我的应用程序 那我能做什么呢 From http nodejs org api debugger html http nodejs org api debugger html 高级用
  • 我可以在会话之外或创建会话之间进行挂钩/回调吗?

    With train and evaluate 可以执行一个计划 根据我传递的规范来训练和评估模型 我可以注册一些钩子EvalSpec https www tensorflow org api docs python tf estimato
  • numpy.genfromtxt 导入元组而不是数组

    我正在尝试学习 Python 和 Numpy 所以请耐心等待 我正在使用 numpy genfromtxt 将 CSV 文件导入到矩阵中 CSV 如下所示 Time min Nm Speed Power Distance Rpm Bpm i
  • Azure Cosmo DB 是否对 45MB 数据库多收费?

    我们使用的 Cosmos DB 是 MongoDB 我们的数据库大小只有 45 MB 所有集合中的文档少于 10 000 个 我们每天运行少量查询和写入 每天少于 3000 个请求 而且我们每晚运行 MongoDB Dump 将整个数据库转
  • VBScript 或 VBA 中的 ISO 周数

    我怎样才能得到ISO 周数 http wikipedia org wiki ISO week dateVBScript 或 VBA 中的某个日期 首先 请注意 报告一周很重要year以及周数 因为日期的年份可能不同 多个 Windows 组
  • iOS 7 中的 UITextView 链接检测

    我有一个UITextView这是通过 Interface Builder 进行管理的 作为数据检测 我检查了 链接 在 iOS 6 中 一切工作正常 链接突出显示并且可以单击 但在 iOS 7 中 所有链接仍然只是纯文本 可编辑和可选择的复
  • 在正则表达式中查找模式的第二次出现

    我的输入是 String t1 test1 testVar varName ns2 test String t2 test2 testVar varName ns2 test defValue String patternString s
  • Ruby 相当于 Python 的 help() 吗?

    当使用交互式 Python 时 我倾向于依赖内置的help 函数告诉我期望和 或返回什么 并打印出任何可能对我有帮助的文档 Ruby 是否有与此功能等效的函数 我正在寻找可以在 irb 中使用的东西 例如 在交互式 Python 中我可以输
  • 使用 pydot 绘制决策树

    我已经训练了一个决定tree Python字典 如下 现在我尝试使用它来绘制它pydot http code google com p pydot 在定义树 pydot 图 的每个节点时 我为其指定一个唯一 且详细 的名称和一个简短的标签
  • 将双精度型/浮点型转换为字符串

    我需要将浮点数转换为十进制 或其他基数 的等效字符串 首先需要按照格式进行转换xE 0 where x是浮点数 我的想法是首先将浮点数截断为临时整数 然后将该整数转换为字符串 然后考虑小数部分 将其乘以10而小数部分不会变成0 将小数部分转
  • 有没有办法将 app/web.config 分成 2 个文件?

    我目前使用 app web config 来存储数据库的连接字符串 这意味着在升级时我们不会触及配置文件来保留这些字符串 然而 我们现在想要迁移到 MVC5 这样做需要在 app web config 中更新所有库定义 我们有一个具有类似配
  • 使用 CanCan 进行上下文感知授权

    我想使用 CanCan 来处理我的权限 我的网站有许多不同的权限级别 其中大多数都是上下文感知的 例如 以下是我的 3 个主要模型中的关系 class User lt ActiveRecord Base has many league re