2015-10-22 3 views
0

Привет Я начинаю обучение в ROR 4 с помощью учебных пособий. Теперь я сделал это приложение cms для начинающих, но я не могу снова войти в него, используя страницу входа, которую я создал. Я проверил использование консоли rails, что имя пользователя и пароль, которые я набираю, являются реальными и существуют в базе данных, и я попытался создать нового пользователя через консоль, но все же я не могу заставить себя войти в приложение. Это заставляет меня нервничать, не будучи в состоянии войти в ваше собственное приложение.ROR 4 - Ошибка аутентификации пользователя

Вот мой Логин кодовой страницы

<% @page_title = "Admin Login" %> 

<div class="login"> 
    <%= form_tag(:action => 'attempt_login') do %> 
    <table> 
    <tr> 
     <td><%= label_tag(:username) %></td> 
     <td><%= text_field_tag(:username) %></td> 
    </tr> 
    <tr> 
     <td><%= label_tag(:password) %></td> 
     <td><%= password_field_tag(:password) %></td> 
    </tr> 
    <tr> 
     <td>&nbsp;</td> 
     <td><%= submit_tag("Log In") %></td> 
    </tr> 
    </table> 
    <% end %> 
</div> 

Вот мой код контроллера

layout 'admin' 

    before_action :confirm_logged_in, :except => [:login, :attempt_login, :logout] 

    def index 
    # display text & links 
    end 

    def login 
    # login form 
    end 

    def attempt_login 
    if params[:username].present? && params[:password].present? 
     found_user = AdminUser.where(:username => params[:username]).first 
     if found_user 
     authorized_user = found_user.authenticate(params[:password]) 
     end 
    end 
    if authorized_user 
     # mark user as logged in 
     session[:user_id] = authorized_user.id 
     session[:username] = authorized_user.username 
     flash[:notice] = "You are now logged in." 
     redirect_to(:action => 'index') 
    else 
     flash[:notice] = "Invalid username/password combination." 
     redirect_to(:action => 'login') 
    end 
    end 

    def logout 
    # mark user as logged out 
    session[:user_id] = nil 
    session[:username] = nil 
    flash[:notice] = "Logged out" 
    redirect_to(:action => "login") 
    end 

end 

был бы очень признательна помощи по этому вопросу.

+0

Если вы получаете неверное имя пользователя/пасс .. Вы должны проверить 'ли found_user.authenticate (PARAMS [: пароль])' фактически возвращение ' true' или нет. – sonalkr132

+0

Я проверял использование консоли rails и да, это возвращает true. И я пробовал это много раз, используя разных пользователей, создавая другого пользователя, а затем снова проверяя его. Но та же ошибка сохраняется. – Ravi

+0

И если есть какой-либо способ проверить это заявление, пожалуйста, дайте мне знать. – Ravi

ответ

0

Прежде всего - не ставьте свою аутентификацию в свой UserController или ApplicationController. Это важный материал. Это заслуживает самого контроллера.

Также в Rails очень важны успокоительные соглашения CRUD. Итак, как бы вы относились к логинам пользователей как к ресурсу?

class SessionsController < ApplicationController 
    # display the form to sign a user in 
    # GET /session/new 
    def new 
    @user = AdminUser.new 
    end 

    # verify that the user is who he says he is and log them in. 
    # POST /session 
    def create 
    reset_session 
    @user = AdminUser.find_by(username: admin_user_params[:username]) 
    if @user && @user.authenticate(admin_user_params[:password]) 
     session[:user_id] = @user.id 
     redirect_to root_path, notice: "You are now logged in." 
    else 
     flash.now[:error] = "Invalid username/password combination." 
     @user = AdminUser.new 
     render :new 
    end 
    end 

    # sign a user out 
    # DELETE /session 
    def destroy 
    reset_session 
    redirect_to root_path, notice: "You have been signed out." 
    end 

    private 

    def admin_user_params 
     params.require(:admin_user).permit(:password, :username) 
    end 
end 

Обратите внимание, что мы называем reset_session до входа и выхода из системы. Это делает недействительным ключ сеанса - это предотвращает уязвимость, известную как фиксация сеанса, когда злоумышленник крадет ваши файлы cookie пользователей.

Также обратите внимание, что мы не будем различать, когда пользователь вводит неправильное имя пользователя или пароль. Это один из способов защитить от атаки радуги, когда хакер сначала догадывается о именах пользователей, а затем использует таблицу радуги, содержащую общие пароли, чтобы вступить в грубую силу. Это угадывает имена пользователей немного сложнее.

Но нам также нужны некоторые маршруты:

# config/routes.rb 
Rails.application.routes.draw do 
    # ... 
    resource :session, only: [:new, :create, :destroy] 
end 

Здесь следует отметить, что мы используем сингулярного ресурс. Это потому, что с точки зрения пользователя существует только один сеанс - свой.

И мы также нужна форма (views/session/new.html.erb):

<%= form_for(@user, url: { action: :create, controller: :sessions }) do |f| %> 
    <%= f.text_field :username %> 
    <%= f.password_field :password %> 
    <%= f.submit "Log in" %> 
<% end %> 
+0

Вместо того, чтобы устранять неполадки в коде, я думаю, что было бы полезно посмотреть на способ «рельсов». – max

+0

Итак, вы просто создали новые сеансы вместо простой проверки подлинности уже существующих пользователей, а затем назначили им сеансы. – Ravi

+0

Извините, если я выйду наивно, но я действительно очень к этому не знаком. Прошло всего неделю с тех пор, как я начал изучать ROR. И я думаю, что не установил аутентификацию в контроллере приложений, но создал контроллер доступа. Код, из которого вставлено выше. – Ravi

Смежные вопросы