5

我正在使用设计。我在表中添加了一个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才能执行操作(例如销毁操作)?

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关于设置Ability课程的内容。CanCan 也包含在作者的精彩截屏视频中

在这个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! 等第三方方法的行为。您可以通过设置第二个过滤器轻松实现,可能如下所示:

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 回答