gpt4 book ai didi

ruby-on-rails - 使用 CanCan 的上下文感知授权

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:36 25 4
gpt4 key购买 nike

我想使用 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?必须为真才能删除 LeagueRelation。如何在league controller内部根据league_relation的属性进行授权,在其他模型上授权其他controller中的其他 Action 。如果您需要更多说明,请发表评论。

谢谢。

最佳答案

好的,我解决了这个问题。我的用例在 CanCan README 的开头被简要提及,但我错过了。您可以在 app/models/中定义新的 Ability 类,它接受除 current_user 之外的其他参数。为此,您将以下内容放入 Controller 中:

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

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

关于ruby-on-rails - 使用 CanCan 的上下文感知授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7102351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com