1

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

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

但是,我有一个两部分的问题——

1)我将如何使用户管理员?

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

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

当我尝试时,我得到

main:Object 的未定义局部变量或方法“参数”

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

这是 users_controller 的副本,我认为 Michael 在教程中解决了这个问题,我按照他的说明进行操作,但我不明白下面的代码如何阻止某人进入命令行并让自己成为管理员

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

非常感谢您帮助清理问题!

4

1 回答 1

0
  1. User.find(params[:101]) 仅适用于 http 浏览器请求。如果您访问http://www.example.com?101=test,那么您可以使用值为“test”的 params[:101]。但是在控制台中,除非您声明它,否则您不能使用参数。在您的情况下,正确的方式将是 User.find(101),如果 101 是用户 ID。
  2. 其他人不能让他们成为管理员,因为您没有为 admin 字段添加 attr_accessible。他们如何通过命令外壳来做到这一点?他们无法访问命令行。如果是这样,那就是严重的安全漏洞。
于 2012-09-28T10:45:25.463 回答