2012-11-01 6 views
5

私はDeviseを使用しています。私は私のusersテーブルにadminブール列を追加しました:"before_filter:authenticate_user!"を使用する方法はありますか?テーブルのブール値と一緒に?

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

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

私は管理者がユーザーを破壊することだけを許可します。 Deviseのbefore_filter :authenticate_user!は、署名されたユーザーのみが操作を実行できるようにすることで機能します。 に何かを追加する方法がありますので、:admin => trueのユーザーだけがアクションを実行できます(破壊アクション)。

+0

問題がある場合は、個別の管理者ロールを作成してください。 – cdesrosiers

答えて

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 
+0

ありがとうございますが、私は破壊活動を作成しなければならないこの仕事をするには?私はDeviseの 'new_registration、:action =>" destroy "を使うことができますか? – alexchenco

+0

before_filter:is_admin ?,:only =>:破壊しますか? – antiqe

+0

私はそれを試みたと思う。しかし、それは破壊アクションはないと文句を言います(私は 'new_registration'コントローラをカスタマイズする唯一の方法はないと思います)。 – alexchenco

3

私は非常にあなたのアプリケーション内で管理者の名前空間の下にすべてのあなたの管理者のアクションを置くことと、そのような承認のためのCanCanCanとして宝石を使用することをお勧めします。

たとえば、Userオブジェクトを削除するアクションは、Admin名前空間の下のUsersControllerにあります。コントローラは、基本的にはこのように定義されます。

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によって提供されます。 Abilityクラスの設定に関して、CanCan wiki already coversを繰り返さないでください。 CanCanもgreat screencast by the authorでカバーされています。

このAbilityクラスの中に、そのブール値フィールドをチェックしてから、CanCanが承認を処理する必要があるクラスです。この新しいAdmin::UsersControllerに実際にルーティングするに

、あなたのconfig/routes.rbファイル内のこの定義:あなたはCanCanCanを使用しない場合

namespace :admin do 
    resources :users 
end 

Punditもあります。

+0

ありがとう!上記のコードでは、 'Admin'という新しいモデルのコントローラがありますか? – alexchenco

+0

いいえ、 'Admin'モデルはありません。 'Admin'は単なる名前空間です。私は最初の答えで名前空間のものに言及していませんでした。私は今それを追加します。 –

+0

CanCanの代わりにCanCanCanを使用することをお勧めします。 CanCanはもはや著者によってサポートされていません。 – antiqe

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 
+0

Deviseの 'new_registration、:action =>" destroy "'を使用できますか? – alexchenco