我正在使用设计。我在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
的用户才能执行操作(例如,销毁操作)?
答案 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