0

我的问题绝对是理论上的,例如“这样做对吗?”。我特别是 Rails 和一般的 Ruby 新手,我正在尝试将 Cancan 自动化解决方案用于我的 Rails 应用程序。

假设我们有一个像这样的简单控制器,一对关联的视图和一个带有 DB 表的用户模型。

class UsersController < ApplicationController
  def index
    @users = User.all
  end
  def show
    @user = User.find(params[:id])
  end
end

目标是将“index”方法的访问权限限制为除管理员之外的所有人,并允许普通用户仅查看他们自己的页面,例如允许 id==5 的用户查看页面“users/5”。对于这个范围,我为 Cancan 创建了一个能力类。这里是:

class Ability
  include CanCan::Ability

  def initialize user, options = {}
    default_rules
    if user
      admin_rules(user) if user.role.eql? "admin"
      player_rules(user) if user.role.eql? "player"
    end
  end

  def admin_rules user
    can :read, UsersController
  end

  def player_rules user
    can :read, User do |user_requested|
      user_requested.id == user.id
    end 
  end

  def default_rules 
  end
end

我的问题是:如果我没有方便的 User 类型的对象,我应该在“can”方法中使用 UsersController 作为对象吗?稍后通过控制器的“index”方法中的“authorize! :show, UsersController”应用它。还是应该以其他方式完成?谢谢你的建议。

4

4 回答 4

2

不,您不想将 UsersController 添加到 CanCan。

CanCan 旨在授权资源,而不是 Rails 控制器。

我建议如下:

def initialize(user)
  if user.is_admin?
    can :manage, User
  else
    can :manage, User, :id => user.id
  end
end

这将只允许用户访问他自己的用户,除非他是管理员。请参阅CanCan Wiki 中的定义能力页面

于 2012-05-14T22:35:52.780 回答
0

在 wiki 中,我找到了另一种设置能力的方法。不过,它有点先进,请在此处查看

   ApplicationController.subclasses.each do |controller|
        if controller.respond_to?(:permission)  
          clazz, description = controller.permission
          write_permission(clazz, "manage", description, "All operations")
          controller.action_methods.each do |action|
...
于 2012-05-17T01:39:09.637 回答
0

我使用了一个符号,例如,在技能类中

def initialize(user)
  if user.is_admin?
    can :any, :admin
  end
end

并在控制器中

authorize! :any, :admin
于 2012-05-14T21:47:02.690 回答
0

+1 @Tigraine。

按照他的指示...

class Ability
  include CanCan::Ability

  def initialize user, options = {}
    default_rules
    if user
      admin_rules(user) if user.role.eql? "admin"
      player_rules(user) if user.role.eql? "player"
    end
  end

  def admin_rules user
    can :manage, User
  end

  def player_rules user
    can :manage, User :id => user.id
  end

  def default_rules 
  end
end

并在您的控制器中执行此操作...

class UsersController < ApplicationController
  load_and_authorize_resource
  # => @users for index
  # => @user for show

  def index
  end
  def show
  end
end

有关 load_and_authorize_resource 的详细信息,请参阅此链接的底部

于 2012-05-16T07:42:07.187 回答