【问题标题】:CanCanCan permissions based on project and roleCanCanCan 基于项目和角色的权限
【发布时间】:2014-06-24 21:30:57
【问题描述】:

我目前有以下情况:

  • 一个企业有很多项目
  • 一个企业有很多用户
  • 一个项目有很多用户
  • 一个用户在不同的项目中有多个角色

这是用表Assignment建模的,它有project_id、role_id、user_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

问题是,现在我想让项目的“管理员”能够向项目添加新用户(这意味着创建一个作业),而这只有在我知道我是什么项目的情况下才能实现m 站在加上我的用户。

如果有人可以帮助我并解释如何通过“三重”关系(项目 - 用户 - 角色)实现这一目标,我将不胜感激。

谢谢!

【问题讨论】:

    标签: ruby-on-rails permissions relationship cancan


    【解决方案1】:

    您需要根据用户和项目来验证角色。所以你需要覆盖 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 
    

    如果你在角色方法中有名字。

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 2023-03-15
      • 1970-01-01
      • 2020-12-17
      • 2021-09-16
      • 1970-01-01
      • 2019-12-08
      • 2020-03-05
      • 2020-12-18
      相关资源
      最近更新 更多