【问题标题】:How can I restrict User role assignment using CanCan?如何使用 CanCan 限制用户角色分配?
【发布时间】:2014-03-07 08:01:17
【问题描述】:

结合使用一些教程和截屏视频来设置 Rails 和 CanCan 以使用 Devise 等。我已经为 has_many :through 连接建立了 UserRoleUserRole 连接模型。而且我只希望某些用户能够分配某些角色,或使用这些角色创建新帐户等。

根据文档here,我觉得这应该很简单。我所拥有的基本上是这样的:

if user
  if user.role? 'admin'
    can :manage, User
  elsif user.role? 'submanager'
    can :manage, User, roles: { name: ['basic', 'premium'] }
  end
else
  can :create, User, roles: { name: ['basic'] }
end

然后我会简单地用以下形式测试它:

- if can? :create, User, roles: { name: 'admin' }
    = check_box 'user[role_ids]', 'admin'

或者,至少,这是要点。相信我,我已经尝试过所有单数、复数、role_idsrolerole: [ ] 的组合。所以我认为这不是那么简单的事情。无论我做什么,can? 检查都会通过。每次。万无一失。

我在 CanCan 上找到了很多东西,但我似乎找不到这个特定的东西。是因为我试图滥用 CanCan,我应该以其他方式这样做吗?或者……我该怎么做?

【问题讨论】:

    标签: ruby-on-rails devise authorization cancan


    【解决方案1】:

    我认为这不应该在 CanCan 中完成,因为 CanCan 的控制粒度在起作用。因此,如果您真的想使用 CanCan 来实现您的意图,我认为您应该将“角色更改”作为方法调用而不是表单提交。

    控制器文件

    class UserController
      def basic
        user.change_role_to_basic
      end
    
      def premium
        user.change_role_to_premium
      end
    end
    

    能力档案

    can :basic, User do
    end
    
    can :premium, User do
    end
    

    【讨论】:

    • 这不仅仅是那么简单,不是吗?我的意思是他们文档中的这个例子怎么样:can :manage, Project, :group => { :id => user.group_ids }
    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 2013-07-10
    相关资源
    最近更新 更多