2016-06-02 3 views
0

Ich versuche, eine sehr einfache Benutzerauthentifizierung für meine Anwendung zu erstellen. Ich denke, das Problem ist, dass das Anmeldeformular nicht auf die Benutzerdatenbank verweist. Wenn ich einen neuen Benutzer erstelle, kann ich ihn automatisch anmelden. Diese Funktion funktioniert gut, aber wenn ich denselben Benutzer im Login-Formular anmelde, gibt es einen Fehler von "Benutzername ist NULL LIMIT 1. Ich verwende Rails 4.2.5. Wenn ich auf die Rails-Konsole gehe, kann ich sehen ., dass der Benutzer immer noch existiert'Login' Formular nicht auf Benutzerdatenbank zugreifen

ich im Voraus für meine schreckliche Codierung Gewohnheiten entschuldigen, habe ich meist selbst unterrichtet Vielen Dank im Voraus für jede Hilfe

Sessions Controller:..

class SessionsController < ApplicationController 

    def new 

    end 

    def create 

    user = User.find_by_username(params[:username]) 

    if user && user.authenticate(params[:username][:password]) 

     session[:user_id] = user.id 

     redirect_to root_path, notice: "You are now logged in." 

    else 

     redirect_to '/login', notice: "incorrect email or password! " 

    end 

    end 

    def destroy 

     session[:user_id] = nil 

     redirect_to root_path, notice: "logged out." 

    end 

end 

Benutzermodell

class User < ActiveRecord::Base 
has_secure_password 
validates_uniqueness_of :username, :email 
validates :password, length: {minimum: 6}, allow_blank: true 
has_many :messages 
end 

Login Form

<div class="login"> 
<%= simple_form_for :sessions do |f| %> 
    <%= f.input :username %> 
    <%= f.input :password %> 
    <%= f.button :submit, "Login" %> 
<% end %> 
</div> 

Wenn ich versuche, das Terminal wieder anmelden,:

Gestartet POST für 127.0.0.1 "/ login" auf 2016.06.02 00.02.15 -0400 Verarbeitung von SessionsController # erstellen, wie HTML Parameter: { "UTF-8" => "✓", "authenticity_token" => "WNJziVL/xhAeGdsjNANi6LWlDrAMIGKm2kDWmsVLfxMh6fCwG1LoRWG09wgsn2z3rIZkreODkHZ0GJeYFCW3yQ ==", "Sitzungen" => { "username" => "crackerjack540", " Passwort "=>" [FILTERED] "}," commit "=>" Login "} Benutzer laden (0.2ms) SELECT" Benutzer ". * FROM" Benutzer " . WHERE "Benutzer" "username" NULL LIMIT 1 Weitergeleitet IS http://localhost:3000/login 302 in 2ms Gefunden Completed (Active: 0,2 ms)

+0

Ein Tipp: Speichern von user_id in Sitzung ist nicht sicher, da es gestohlen und wiederverwendet werden kann. Sie sollten bei jeder Anmeldung ein neues Sitzungstoken generieren und dieses stattdessen speichern. –

+0

Wird tun. Ich schätze den Tipp! –

Antwort

1

Benutzername ist in der Session-Objekt, also statt dessen:

user = User.find_by_username(params[:username]) 

Sie sollten dies tun:

user = User.find_by_username(params[:sessions][:username]) 

auch weiter unten, das Passwort für den Zugriff auf:

user.authenticate(params[:sessions][:password]) 

Hoffe, das hilft!

+0

Vielen Dank, aber jetzt heißt es "username =?" anstelle von "Benutzername ist NULL". –

+0

Stellen Sie sicher, dass Sie den richtigen Benutzernamen erhalten, wenn Sie auf params [: sessions] [: username] zugreifen (versuchen Sie, den Wert selbst auszugeben, um dies zu überprüfen) – Alberto

+0

Vielen Dank. Es hat funktioniert. Ich musste einen neuen Benutzer zur Datenbank hinzufügen, und jetzt funktioniert es wie ein Charme. –