1

私は、Michael Hartl による Rails チュートリアルに取り組んでおり、管理者ユーザーを作成していたときに質問が表示されました。

指示に従い、:destroy メソッドにアクセスできる admin_user を作成しました。また、attr_accessible ではないため、ブラウザから put リクエストを送信して、テーマ自体を admin に変更することはできません。

しかし、私は 2 つの部分からなる質問があります--

1) ユーザー管理者を作成するにはどうすればよいですか?

コンソールにこのようなものを書く必要があると思いました

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

私がそれを試みるとき、私は得る

main:Object の未定義のローカル変数またはメソッド 'Params'

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] を使用できます。ただし、コンソールでは、宣言しない限り params を使用できません。あなたの場合、101がユーザーIDの場合、正しい方法はUser.find(101)になります。
  2. admin フィールドに attr_accessible を追加していないため、他の人がそれらを管理者にすることはできません。コマンド シェル経由でどのように行うことができますか? コマンドラインにはアクセスできません。もしそうなら、それは深刻なセキュリティ違反です。
于 2012-09-28T10:45:25.463 に答える