5

私は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

管理者のみがユーザーを破棄できるようにしたい。Devisebefore_filter :authenticate_user!は、サインインしたユーザーのみがアクションを実行できるようにすることで機能します。:authenticate_userユーザーだけがアクションを実行できるように何かを追加する方法はあり:admin => trueますか (e.g. 破棄アクション)?

4

3 に答える 3

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
于 2012-11-01T04:46:05.230 に答える
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 が既にカバーしていることは繰り返しません。AbilityCanCan は、著者による素晴らしいスクリーンキャストでも取り上げられています。

Abilityこのブール値フィールドをチェックしてから、CanCan に承認を処理させる必要があるのは、このクラス内です。

実際にこの new にルーティングするには、ファイルAdmin::UsersController内でこれを定義します。config/routes.rb

namespace :admin do
  resources :users
end

CanCanCan を使用したくない場合は、Punditもあります。

于 2012-11-01T04:47:16.540 に答える
2

:authenticate_user! などのサードパーティ メソッドの動作を変更しないことをお勧めします。次のように簡単な 2 番目のフィルターを設定することで、簡単に実現できます。

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
于 2012-11-01T04:48:17.770 に答える