加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 使用CanCan在Rails 4上授权用户在连接表中使用

发布时间:2020-12-17 02:21:36 所属栏目:百科 来源:网络整理
导读:我正在使用Rails 4.0.0,ruby 2.0.0p247和CanCan 1.6.10. 如何基于CanCan在连接表中的角色授权用户(has_many:through)? 我有3个模型:User,Group和GroupUser. 用户和组通过GroupUser表关联为has_many.每个GroupUser还有一个角色字段,可以是“编辑者”或“所
我正在使用Rails 4.0.0,ruby 2.0.0p247和CanCan 1.6.10.

如何基于CanCan在连接表中的角色授权用户(has_many:through)?

我有3个模型:User,Group和GroupUser.

用户和组通过GroupUser表关联为has_many.每个GroupUser还有一个角色字段,可以是“编辑者”或“所有者”.一个组可以有多个用户,每个用户具有不同的角色.此外,用户可以在多个组中拥有角色.

我有使用CanCan功能的应用程序设置,但它不是仅限制具有正确角色的用户的访问权限,而是授权所有人.

模型设置如下.另请注意,Group有一种方法可以返回其所有者列表.

class User < ActiveRecord::Base
  has_many :group_users
  has_many :groups,through: :group_users
end

class Group < ActiveRecord::Base
  has_many :group_users
  has_many :users,through: :group_users

  def owners
    User.find(self.group_users.where(role: 'owner').map(&:user_id))
  end
end

class GroupUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

CanCan能力.请注意,它在Group上使用owner方法.

class Ability
  include CanCan::Ability

  def initialize(user)

    can :update,Group do |group|
      group.owners.include?(user)
    end

  end
end

视图如下.在这里,无法看到链接的用户仍然可以看到它.

<ul class="groups">
    <% @groups.each do |group| %>
        <li>
            <p><%= group.name %></p>
            <% if can? :update,Group %>
                <%= link_to "Edit",edit_group_path(group) %>
            <% end %>
        </li>
    <% end %>
</ul>

最后,视图的Controller操作是:

def index
  @groups = current_user.groups
end

. . .
有趣的是,即使它在实际使用中不起作用,下面的单元测试也会通过:

test 'user can only update groups they own' do
  ability_one = Ability.new(users(:one)) # Owner
  ability_two = Ability.new(users(:two)) # Not-owner

  assert ability_one.can?(:update,groups(:one))
  assert ability_two.cannot?(:update,groups(:two))
end

解决方法

我认为你应该让cancan在这里使用真实对象,将实际的组对象传递给can?方法而不是Group类:

在视图中:

<% if can? :update,group %>

代替:

<% if can? :update,Group %>

这样,如果current_user能够:更新实际组,您将询问cancan.由于没有为通用Group对象设置操作的能力,因此第二个条件将始终为true.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读