Проблема аутентификации - не распознается 'else' - Ruby on rails - PullRequest
0 голосов
/ 28 апреля 2010

Я не могу понять, что я делаю здесь неправильно. Я реализовал Super Simple Authentication из учебника Райана Бейтса, и хотя часть входа в систему функционирует правильно, я не могу получить сообщение об ошибке и перенаправление, чтобы оно произошло правильно при неправильном входе.

Райан Бейтс признается в своих комментариях, что он не учел это, но не может выполнить свою рекомендацию. В основном происходит то, что, когда кто-то входит в систему правильно, это работает. Когда введен неверный пароль, он делает то же самое перенаправление и мигает «успешно авторизован», хотя это не так. Ссылки администратора не отображаются (это правильно и защищены ли они ссылками <% if admin?%>), Но мне нужно сказать «сбой входа» и перенаправить на путь входа. Вот мой код:

SessionsController

class SessionsController < ApplicationController
   def create
      if 
      session[:password] = params[:password]
      flash[:notice] = 'Successfully logged in'
      redirect_to posts_path
    else
      flash[:notice] = "whoops"
      redirect_to login_path
    end
  end

    def destroy
      reset_session
      flash[:notice] = 'Successfully logged out'
      redirect_to posts_path
    end
  end

ApplicationController

class ApplicationController < ActionController::Base

  helper_method :admin?

  protected

  def authorize
    unless admin?
      flash[:error] = "unauthorized request"
      redirect_to posts_path
      false
    end
  end

  def admin?
    session[:password] == "123456"
  end

  helper :all # include all helpers, all the time
  protect_from_forgery # See ActionController::RequestForgeryProtection for details
  # 
end

Ответы [ 5 ]

2 голосов
/ 28 апреля 2010

Вам необходимо использовать оператор сравнения Ruby == вместо оператора присваивания =. Ваше create действие должно быть:

def create 
  if session[:password] == params[:password] 
    flash[:notice] = 'Successfully logged in' 
    redirect_to posts_path 
  else 
    flash[:notice] = "whoops" 
    redirect_to login_path 
  end 
end 


Редактировать: Проблема в том, что нигде в вашем SessionsController вы на самом деле не проверяете введенный пароль с правильным паролем. Измените свой create метод на этот:

def create 
  if params[:password] == '123456'
    session[:password] = params[:password]
    flash[:notice] = 'Successfully logged in' 
    redirect_to posts_path 
  else 
    flash[:notice] = "whoops" 
    redirect_to login_path 
  end 
end

Не идеально иметь такой жестко запрограммированный пароль и сохранять его в сеансе для использования вспомогательным методом admin?, но предполагается, что это супер простая аутентификация .

0 голосов
/ 28 апреля 2010

Дело в том, что используемый вами учебник не выполняет аутентификацию пользователя. Он только проверяет, принадлежит ли логин администратору, поэтому будет отображаться некоторый контент.

Таким образом, у вас никогда не будет неправильного логина / пароля, просто администратор / не администратор.

0 голосов
/ 28 апреля 2010

Редактировать : См. Ответ @ Джона. :)

Попробуйте это:

  def create
    if session[:password] == '123456'
      flash[:notice] = 'Succesfully logged in'
      redirect_to home_path
     else
      flash[:notice] = "Incorrect Password!"
      redirect_to login_path
    end
  end
0 голосов
/ 28 апреля 2010

У вас никогда не возникает состояние отказа из-за:

if session[:password] = session[:password]

Это всегда будет правдой. Вы, вероятно, хотите что-то вроде:

if session[:password] == 'canihazpasswrd' then
  do_something_here
0 голосов
/ 28 апреля 2010
    if  #YOU MISSING SOMETHING HERE WHICH Returns TRUE IF USER IS VALID
      session[:password] = session[:password]
      flash[:notice] = 'Successfully logged in'
      redirect_to posts_path
    else
      flash[:notice] = "invalid login"  #CHange if messaage for invalid login
      redirect_to login_path
    end

должно быть

    if   session[:password] == params[:password]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...