4

我有一个超级简单的问题。我有一个页面列出了我的应用程序中的所有产品。我只想让该页面只能由管理员查看。但是产品/新品我希望每个人都能看清楚。

架构.rb

  create_table "users", :force => true do |t|
    t.string   "email"
    t.string   "password_hash"
    t.string   "password_salt"
    t.datetime "created_at",      :null => false
    t.datetime "updated_at",      :null => false
    t.string   "name"
    t.boolean  "admin",           :default => false
  end

产品控制器

class ProductsController < ApplicationController
    before_filter :require_login
    before_filter :current_user, only: [:create, :destory]
    before_filter :correct_user, only: :destory

  def index
    @products = Product.all
  end

  def new 
    @product = Product.new
  end

  def create
  @product = current_user.products.new(params[:product])
    if @product.valid? 
      @product.save
        render "show", :notice => "Sale created!"
    else
        render "new", :notice => "Somehting went wrong!"
    end
end
4

6 回答 6

8

放入你的控制器

before_filter :authorize_admin, only: :index

并在 application_controller.rb

def authorize_admin
    redirect_to :back, status: 401 unless current_user.admin
    #redirects to previous page
end
于 2013-06-11T10:59:24.013 回答
2

在你的控制器中写

before_filter :admin_user

并像这样创建一个def

private
def admin_user
  redirect_to(root_path) unless current_user && current_user.admin?
end
于 2013-06-11T11:50:20.823 回答
1

你试过什么?这不是一个发人深省的问题,您有一个布尔值用于管理员,并且您想将操作限制为仅管理员,所以只需检查current_user.admin.

before_filter :require_admin, only: :index

private
  def require_admin
    if !current_user.admin
      if request.xhr?
        head :unauthorized # for asynchronous/api requests, if you want.
      else
        render 'access/no_access' and return # or whatever.
      end
    end
  end
于 2013-06-11T11:03:03.847 回答
1

在您的 ProductsController 中,您可以添加一个函数来验证用户是否是管理员,并使用过滤器来过滤您想要保护的视图,如下所示:

class ProductsController < ApplicationController

  before_filter :admin_user,     only: :index # here you specify the action (for views) to protect
  .
  .
  .
  private
  .
  .
    def admin_user
      redirect_to(root_url) unless current_user.admin?
    end
 end

我希望对你有帮助

于 2013-06-11T11:15:56.513 回答
1

在您的控制器上的私有下添加correct_user方法和admin_user方法,或者使用以下定义创建另一个方法并为管理员添加:only => :indexbefore_filter

before_filter :require_login
before_filter :correct_user
before_filter :admin_user, :only => :index


private

def correct_user
  redirect_to(root_path) if current_user.nil?  && !current_user.admin?
end

def admin_user
  redirect_to(root_path) unless current_user.admin?
end
于 2013-06-11T12:05:41.943 回答
-1

检查 Railscasts Episode Super Simple Authentication

实际上,Ryan Bates 非常喜欢从头开始进行身份验证,他在这个主题上做了很多插曲。看看他们,你一定会得到一些好主意。

于 2013-06-11T11:00:05.613 回答