将普通用户转变为管理员用户导航教程

时间:2012-09-28 10:22:29

标签: ruby-on-rails ruby-on-rails-3 railstutorial.org

我正在使用Michael Hartl的Rails教程,并且在我创建管理员用户时出现了一个问题。

我按照说明操作,创建了一个admin_user,可以访问:destroy方法。它也不是attr_accessible,因此人们不能简单地通过浏览器发出put请求并将其自身更改为admin。

但是,我有一个由两部分组成的问题 -

1)我如何建立用户管理员?

我虽然需要在控制台中写这样的东西

rails console
user = User.find(params[:101])
user.toggle!(:admin)

当我尝试时,我得到了

  

主要的未定义局部变量或方法'参数':对象

2)假设有可能让自己成为管理员,那么是什么阻止其他人使用命令行进行管理?

这是users_controller的副本,我认为迈克尔在教程中解决了这个问题,并且我遵循了他的指示,但是我不知道下面的代码如何阻止某人进入命令行并使自己成为管理员

class UsersController < ApplicationController
  before_filter :signed_in_user, 
                only: [:edit, :update, :index, :destroy]
  before_filter :correct_user,   only: [:edit, :update]  
 before_filter :admin_user,     only: :destroy

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "User destroyed."
    redirect_to users_url
  end

  def index
    @users = User.paginate(page: params[:page])
  end

  def show
    @user = User.find(params[:id])
   end

  def new
    unless signed_in?
      @user = User.new
    else
      redirect_to @current_user
    end

  end

  def create
    unless signed_in?
      @user = User.new(params[:user])
      if @user.save
        sign_in @user
        flash[:success] = "Welcome to the Sample App!"
        redirect_to @user
      else
        render 'new'
      end
    else
      redirect_to @current_user
    end
  end

  def edit
  end

  def update
    if @user.update_attributes(params[:user])
      flash[:success] = "Profile updated"
      sign_in @user
      redirect_to @user
    else
      render 'edit'
    end
  end


  private

    def signed_in_user
      unless signed_in?
        store_location
        redirect_to signin_url, notice: "Please sign in."
      end
    end

    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_path) unless current_user?(@user)
    end

def admin_user
      redirect_to(root_path) unless current_user.admin?
    end
end

我真的很感谢你的帮助清理了一切!

1 个答案:

答案 0 :(得分:0)

  1. User.find(params [:101])仅适用于http浏览器请求。如果您访问http://www.example.com?101=test,则可以使用值为“test”的参数[:101]。但是在控制台中,除非你声明它,否则你不能使用params。在您的情况下,如果101是用户ID,那么wright方式将是User.find(101)。
  2. 其他人无法将其设为admin,因为您没有为admin字段添加attr_accessible。他们怎么能通过命令shell来做呢?他们无法访问命令行。如果它们是严重的安全漏洞。