Ruby on rails 基于项目和角色的CanCanCan权限

Ruby on rails 基于项目和角色的CanCanCan权限,ruby-on-rails,permissions,relationship,cancan,Ruby On Rails,Permissions,Relationship,Cancan,我目前的情况如下: 一个企业有很多项目 一个企业有很多用户 一个项目有许多用户 一个用户在不同的项目上有许多角色 这是用表分配建模的,表分配有项目id、角色id、用户id 有四个角色:管理员、观察者、用户、来宾 我想根据我在特定项目中的角色授予权限,但是CanCan只接收我的用户,而不是我所在的项目,因此我不知道如何仅基于用户授予权限 这是我当前的代码,从辩护上说是不正确的,但它已经起作用了 def initialize(user) user ||= User.new # guest

我目前的情况如下:

  • 一个企业有很多项目
  • 一个企业有很多用户
  • 一个项目有许多用户
  • 一个用户在不同的项目上有许多角色
这是用表分配建模的,表分配有项目id、角色id、用户id

有四个角色:管理员、观察者、用户、来宾

我想根据我在特定项目中的角色授予权限,但是CanCan只接收我的用户,而不是我所在的项目,因此我不知道如何仅基于用户授予权限

这是我当前的代码,从辩护上说是不正确的,但它已经起作用了

  def initialize(user)

user ||= User.new # guest user (not logged in)
if user.admin?
    can :manage, :all
else
    can [:activate], User
    can [:show,:index,:project_summary, :add_stage],Project
    # only if the user is logged in
    if user.id!=nil
        can [:create,:update,:edit],Project do |p|
            (user.assignments.where(project_id: p.id,role_id: 1,user_id: user.id).any? || user.assignments.where(role_id: 1,user_id: user.id).any? )
        end
        can [:show,:update, :add_user], Enterprise do |e|
            user.assignments.where(role_id: 1,user_id: user.id).any?
        end
        can [:show],Enterprise do |e|
            user.enterprise.id==e.id
        end
        # can only update if its his own
        can [:show,:edit, :update], User, id: user.id
    end
end
问题是,现在我想让项目的“管理员”能够向项目添加新用户(这意味着创建任务),而这只有在我知道我所在的项目以及我的用户的情况下才能实现

如果有人能帮助我,并解释我如何通过“三重”关系(项目-用户-角色)实现这一点,我将非常感激


谢谢

您需要根据用户和项目验证角色。因此,您需要覆盖可以进入ApplicationController或从其他需要权限的控制器设置的能力方法

  def current_ability
    @current_ability ||= Ability.new(current_user, params[:project_id]) // Or params[:id]
  end
你可以像上面那样做

然后你可以从这里得到这个角色

Assignment.find_by(user.id: self.id, project.id: project_id).role.name 
如果您在role方法中有名称