有没有办法使用“before_filter:authenticate_user!”和表中的布尔值一起?

时间:2012-11-01 04:21:33

标签: ruby-on-rails devise

我正在使用设计。我在admin表中添加了users布尔列:

class AddAdminToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :admin, :boolean, :default => false
  end

  def self.down
    remove_column :users, :admin
  end
end

我想只允许管理员销毁用户。 设计before_filter :authenticate_user!仅通过启用已登录用户来执行操作。有没有办法向:authenticate_user添加内容,以便只有:admin => true的用户才能执行操作(例如,销毁操作)?

3 个答案:

答案 0 :(得分:6)

before_filter :authenticate_user!
before_filter :is_admin?

def is_admin?
  if current_user.admin?
    true
  else
    render :text => 'Who are you to doing this? :)'
  end
end

答案 1 :(得分:3)

我强烈建议您将所有管理操作放在应用程序的管理命名空间下,并使用CanCanCan等gem来进行授权。

例如,删除User对象的操作将位于UsersController命名空间下方的Admin中。控制器基本上定义如下:

 class Admin::UsersController < Admin::BaseController
   def destroy
     user = User.find(params[:id])
     user.destroy
     redirect_to admin_users_path
   end
 end

此处引用的Admin::BaseController是为您的管理命名空间提供基础的控制器。它应该授权用户,如下:

 class Admin::BaseController < ApplicationController
   before_filter :authenticate_user!
   before_filter :authorize_admin

   def authorize_admin
     authorize! :manage, :all
   end
 end

authorize!帮助将由CanCan提供。我不会重复CanCan wiki already covers关于设置Ability课程的内容。 CanCan也包含在great screencast by the author中。

在这个Ability类中,您应该检查该布尔字段,然后让CanCan处理授权。

要实际路由到这个新的Admin::UsersController,请在config/routes.rb文件中定义:

namespace :admin do
  resources :users
end

如果您不想使用CanCanCan,还有Pundit

答案 2 :(得分:2)

建议不要修改第三方方法的行为,例如:authenticate_user!。您可以通过设置第二个过滤器轻松实现,这可能与以下内容一样简单:

before_filter :ensure_admin, :only => [:new, :create]

private

def ensure_admin
 unless current_user && current_user.admin?
   render :text => "You are not authorised to perform this action", :status => :unauthorized
 end
end