Heim  >  Artikel  >  Backend-Entwicklung  >  20150720 – Fallstricke bei der Laravel-Anmeldeüberprüfung

20150720 – Fallstricke bei der Laravel-Anmeldeüberprüfung

WBOY
WBOYOriginal
2016-08-08 09:20:371668Durchsuche

Notieren Sie die Fallstricke, auf die Sie getreten sind, und es wird in Zukunft immer weniger Fallstricke geben...

Erstellen Sie zunächst eine Tabelle:

<code><span>php</span><span>artisan</span><span>migrate</span><span>:make_admin_table</span></code>

Dann schreiben Sie in der neuen Datei Legen Sie jede Spalte der Tabelle fest

<code><span><?</span>php

use Illuminate<span>\</span>Database<span>\</span>Schema<span>\</span>Blueprint;
use Illuminate<span>\</span>Database<span>\</span>Migrations<span>\</span>Migration;

class CreateAdminTable extends Migration {

    <span>/**
     * Run the migrations.
     *
     * @return void
     */</span><span>public</span> function up()
    {
        Schema<span>::create</span>(<span>'admin'</span>, function(<span>$table</span>)
        {
            <span>$table</span><span>-></span>increments(<span>'id'</span>);
            <span>$table</span><span>-></span><span>string</span>(<span>'staff_code'</span>, <span>32</span>)<span>-></span>nullable();           <span>//员工号</span><span>$table</span><span>-></span><span>string</span>(<span>'login_name'</span>, <span>32</span>)<span>-></span>nullable();           <span>//登录名</span><span>$table</span><span>-></span><span>string</span>(<span>'password'</span>, <span>32</span>)<span>-></span>nullabele();            <span>//登录密码</span><span>$table</span><span>-></span><span>string</span>(<span>'mail'</span>, <span>512</span>)<span>-></span>nullable();                <span>//电子邮箱</span><span>$table</span><span>-></span><span>string</span>(<span>'staff_name'</span>, <span>32</span>)<span>-></span>nullable();           <span>//员工姓名</span><span>$table</span><span>-></span><span>string</span>(<span>'sex'</span>, <span>10</span>)<span>-></span>nullable();                  <span>//性别</span><span>$table</span><span>-></span><span>string</span>(<span>'belong_to'</span>, <span>512</span>)<span>-></span>nullable();           <span>//所属部门</span><span>$table</span><span>-></span><span>string</span>(<span>'jobs'</span>, <span>512</span>)<span>-></span>nullable();                <span>//岗位</span><span>$table</span><span>-></span><span>string</span>(<span>'telephone'</span>, <span>32</span>)<span>-></span>nullable();            <span>//固定电话</span><span>$table</span><span>-></span><span>string</span>(<span>'mobile'</span>, <span>32</span>)<span>-></span>nullable();               <span>//手机号</span>
        });
    }

    <span>/**
     * Reverse the migrations.
     *
     * @return void
     */</span><span>public</span> function down()
    {
        Schema<span>::dropIfExists</span>(<span>'admin'</span>);
    }

}</code>

Erstellen Sie einen Modelladministrator:

<code>php ratisan <span>generate</span> modle Admin</code>

Fügen Sie dann zur Erläuterung

<code><span><?php</span><span>use</span><span>Illuminate</span>\<span>Auth</span>\<span>UserTrait</span>;
<span>use</span><span>Illuminate</span>\<span>Auth</span>\<span>UserInterface</span>;
<span>use</span><span>Illuminate</span>\<span>Auth</span>\<span>Reminders</span>\<span>RemindableTrait</span>;
<span>use</span><span>Illuminate</span>\<span>Auth</span>\<span>Reminders</span>\<span>RemindableInterface</span>;

<span><span>class</span><span>Admin</span><span>extends</span> \<span>Eloquent</span><span>implements</span><span>UserInterface</span>, <span>RemindableInterface</span> {</span><span>use</span><span>UserTrait</span>, <span>RemindableTrait</span>;

    <span>protected</span><span>$fillable</span> = [];

    <span>protected</span><span>$table</span> = <span>'admin'</span>; <span>// 指定表名</span><span>protected</span><span>$primaryKey</span> = <span>'id'</span>; <span>// 指定主键名</span><span>protected</span><span>$hidden</span> = <span>array</span>(<span>'password'</span>);  <span>//密码字段</span><span>public</span><span>$timestamps</span> = <span>false</span>; <span>// 关闭 创建时间 与 更新时间 的自动维护</span><span>public</span><span><span>function</span><span>getRememberToken</span><span>()</span>{</span><span>return</span><span>$this</span>->rememberToken ;
    }

    <span>public</span><span><span>function</span><span>setRememberToken</span><span>(<span>$value</span>)</span>{</span><span>$this</span>->rememberToken = <span>$value</span> ;
    }

    <span>public</span><span><span>function</span><span>getRememberTokenName</span><span>()</span>{</span><span>return</span><span>$this</span>->reminder ;
    }
}</span></code>

zur generierten Datei hinzu , weil es für die Anmeldeüberprüfung durchgeführt werden muss, wird Laravels eigene Authentifizierung verwendet, daher müssen Sie use hinzufügen und die Schnittstellen UserInterface und RemindableInterface erben und einige Methoden neu schreiben
Konkret sind das diese Sätze

<code><span>use</span><span>Illuminate</span>\<span>Auth</span>\<span>UserTrait</span>;
<span>use</span><span>Illuminate</span>\<span>Auth</span>\<span>UserInterface</span>;
<span>use</span><span>Illuminate</span>\<span>Auth</span>\<span>Reminders</span>\<span>RemindableTrait</span>;
<span>use</span><span>Illuminate</span>\<span>Auth</span>\<span>Reminders</span>\<span>RemindableInterface</span>;

<span><span>class</span><span>Admin</span><span>extends</span> \<span>Eloquent</span><span>implements</span><span>UserInterface</span>, <span>RemindableInterface</span> {</span><span>use</span><span>UserTrait</span>, <span>RemindableTrait</span>;
    <span>/*******
    以下代码省略
    *******/</span><span>public</span><span><span>function</span><span>getRememberToken</span><span>()</span>{</span><span>return</span><span>$this</span>->rememberToken ;
    }

    <span>public</span><span><span>function</span><span>setRememberToken</span><span>(<span>$value</span>)</span>{</span><span>$this</span>->rememberToken = <span>$value</span> ;
    }

    <span>public</span><span><span>function</span><span>getRememberTokenName</span><span>()</span>{</span><span>return</span><span>$this</span>->reminder ;
    }
    }</code>

Dann suche ich weiter nach den Einstellungen der Auth-Datei und ändere die Tabellen, die verwendet werden müssen
app/config/auth.php
Suchen Sie die folgenden Felder und ändern Sie sie in die von Ihnen angegebene Tabelle

<code><span><?php</span><span>return</span><span>array</span>(

<span>'driver'</span> => <span>'eloquent'</span>, <span>//验证方式,有database和eloquent两种</span><span>'model'</span> => <span>'Admin'</span>, <span>//所使用的model名</span><span>'table'</span> => <span>'admin'</span>, <span>//对应的表名</span><span>'reminder'</span> => <span>array</span>(

        <span>'email'</span> => <span>'emails.auth.reminder'</span>,

        <span>'table'</span> => <span>'password_reminders'</span>,

        <span>'expire'</span> => <span>60</span>,

    ),

);</span></code>

. Fügen Sie dann die Controller-Methode hinzu:

<code><span>//获取登录页面</span><span>public</span> function get_web_login(){

        <span>return</span> View<span>::make</span>(<span>'web.web_login'</span>);

    }

    <span>//登录验证</span><span>public</span> function post_login(){
        <span>if</span> (Auth<span>::attempt</span>(<span>array</span>(<span>'login_name'</span><span>=></span>Input<span>::get</span>(<span>'login_name'</span>), <span>'password'</span><span>=></span>Input<span>::get</span>(<span>'password'</span>)))) {

            Notification<span>::success</span>(<span>'登录成功'</span>);

            <span>return</span> Redirect<span>::to</span>(<span>'/web/index'</span>)
            <span>-></span><span>with</span>(<span>'message'</span>, <span>'成功登录'</span>);
        } <span>else</span> {

            Notification<span>::warning</span>(<span>'用户名密码不正确'</span>);

            <span>return</span> Redirect<span>::to</span>(<span>'/web/login'</span>)
            <span>-></span><span>with</span>(<span>'message'</span>, <span>'用户名密码不正确'</span>)
                <span>-></span>withInput();
        }

    }</code>

Dann die Ansichtsdatei login.blade.php:

<code><span>@section</span>(<span>'title'</span>)登录 - <span>@parent</span><span>@stop</span><span>@section</span>(<span>'nav_1'</span>)
    <li <span>class</span>=<span>"active"</span>><a href=<span>"#"</span>>登录</a></li>
<span>@stop</span><span>@section</span>(<span>'selection'</span>)
    <div id=<span>"login"</span><span>class</span>=<span>"login"</span>>
        <form <span>class</span>=<span>"form"</span> role=<span>"form"</span> action=<span>"{{URL::route('web.web_login.post')}}"</span> style=<span>"width: 500px"</span> method=<span>"post"</span>>
            <span>@if</span> (Session::has(<span>'message'</span>))

                <div <span>class</span>=<span>"alert alert-error"</span>>{{ Session::get(<span>'message'</span>)}}</div>

            <span>@endif</span>
            <div <span>class</span>=<span>"form-group"</span>>
                <label <span>for</span>=<span>"login_name"</span>>登录名:</label>
                <input <span>type</span>=<span>"text"</span><span>class</span>=<span>"form-control"</span> id=<span>"login_name"</span> name=<span>"login_name"</span>>
                <label <span>for</span>=<span>"password"</span>>密码:</label>
                <input <span>type</span>=<span>"password"</span><span>class</span>=<span>"form-control"</span> id=<span>"password"</span> name=<span>"password"</span>>

            </div>
            <div align=<span>"left"</span>>
                <button <span>type</span>=<span>"submit"</span><span>class</span>=<span>"btn btn-info btn-lg"</span>><span <span>class</span>=<span>"glyphicon glyphicon-user"</span> aria-hidden=<span>"true"</span>></span>  登录</button>


            </div>
        </form>
    </div>
<span>@stop</span></code>

Endlich die Route aktualisieren

<code>Route::get(<span>'/web/index'</span>, <span>array</span>(<span>'as'</span> => <span>'web.web_index'</span>, <span>'uses'</span> => <span>'App\Controllers\Api\WebController@get_web_index'</span>));
<span>//登录页面</span>
Route::get(<span>'/web/login'</span>, <span>array</span>(<span>'as'</span> => <span>'web.web_login'</span>, <span>'uses'</span> => <span>'App\Controllers\Api\WebController@get_web_login'</span>));
Route::post(<span>'/web/login'</span>, <span>array</span>(<span>'as'</span> => <span>'web.web_login.post'</span>, <span>'uses'</span> => <span>'App\Controllers\Api\WebController@post_login'</span>));
</code>

Nachdem ich die oben genannte Arbeit erledigt hatte, öffnete ich die Datenbank und stopfte zufällig ein Stück Benutzerdaten hinein, dann versuchte ich mich anzumelden, und dann kam das Problem

Egal was ich versuche, das Kontopasswort ist falsch

Baidu Google, aber es wurden keine Ergebnisse gefunden
In meiner Verzweiflung kann ich mir nur den Quellcode von Laravel
ansehen Das erste, was ich aufrufen musste, war die Versuchsmethode zur Überprüfung des Benutzernamens und des Passworts, also bin ich in diese Funktion gesprungen und habe einen Blick darauf geworfen.

<code><span>/**
         * Attempt to authenticate a user using the given credentials.
         *
         *<span> @param</span> array $credentials
         *<span> @param</span> bool $remember
         *<span> @param</span> bool $login
         *<span> @return</span> bool 
         *<span> @static</span>         */</span><span>public</span><span>static</span> function <span>attempt</span>($credentials = array(), $remember = <span>false</span>, $login = <span>true</span>){
            <span>return</span> \Illuminate\Auth\Guard::attempt($credentials, $remember, $login);
        }</code>

Es war nicht schwer zu erkennen, dass es sich nur um das Ergebnis von Guar handelte Die ::attempt-Methode wurde zurückgegeben, also fuhr ich fort. Wenn Sie sich

<code><span>/**
     * Attempt to authenticate a user using the given credentials.
     *
     * @param  array  $credentials
     * @param  bool   $remember
     * @param  bool   $login
     * @return bool
     */</span><span>public</span> function attempt(<span>array</span><span>$credentials</span><span>=</span><span>array</span>(), <span>$remember</span><span>=</span><span>false</span>, <span>$login</span><span>=</span><span>true</span>)
    {
        <span>$this</span><span>-></span>fireAttemptEvent(<span>$credentials</span>, <span>$remember</span>, <span>$login</span>);

        <span>$this</span><span>-></span>lastAttempted <span>=</span><span>$user</span><span>=</span><span>$this</span><span>-></span>provider<span>-></span>retrieveByCredentials(<span>$credentials</span>);

        <span>// If an implementation of UserInterface was returned, we'll ask the provider</span><span>// to validate the user against the given credentials, and if they are in</span><span>// fact valid we'll log the users into the application and return true.</span><span>if</span> (<span>$this</span><span>-></span>hasValidCredentials(<span>$user</span>, <span>$credentials</span>))
        {
            <span>if</span> (<span>$login</span>) <span>$this</span><span>-></span>login(<span>$user</span>, <span>$remember</span>);

            <span>return</span><span>true</span>;
        }

        <span>return</span><span>false</span>;
    }</code>

ansehen, können Sie wahrscheinlich erkennen, dass das Anmeldeergebnis durch das von der hasValidCredentials-Methode zurückgegebene Ergebnis gesteuert werden sollte. Wie wird es also intern implementiert? Gehen Sie hinein und werfen Sie einen Blick darauf

<code><span>/**
     * Determine if the user matches the credentials.
     *
     *<span> @param</span>  mixed  $user
     *<span> @param</span>  array  $credentials
     *<span> @return</span> bool
     */</span><span>protected</span> function <span>hasValidCredentials</span>($user, $credentials)
    {
        <span>return</span> ! is_null($user) && $<span>this</span>->provider->validateCredentials($user, $credentials);
    }</code>

Hier ist jedoch nur eine einfache Beurteilung, um festzustellen, ob der Parameter $user vorhanden ist, also gehe ich weiter zur Methode „validateCredentials“

<code><span>/**
     * Validate a user against the given credentials.
     *
     *<span> @param</span>  \Illuminate\Auth\UserInterface  $user
     *<span> @param</span>  array  $credentials
     *<span> @return</span> bool
     */</span><span>public</span> function <span>validateCredentials</span>(UserInterface $user, array $credentials);</code>

Ich bin neu hier, was Laravel bedeutet, also konnte ich nur weiter googeln, und dann habe ich wirklich einige relevante Informationen gefunden
Erweiterte Auth-Funktionalität
Nach dem Lesen dieses Beitrags und dem Verständnis des obigen Codes
Folgen Sie dem Verzeichnis mit der Aufschrift
/vender/laravel/framework/src/illuminate/Auth
Also habe ich die Datei EloquentUserProvider.php
gefunden Darin wurde die spezifische Implementierung der Methode „validateCredentials“ gefunden

<code><span>/**
     * Validate a user against the given credentials.
     *
     *<span> @param</span>  \Illuminate\Auth\UserInterface  $user
     *<span> @param</span>  array  $credentials
     *<span> @return</span> bool
     */</span><span>public</span> function <span>validateCredentials</span>(UserInterface $user, array $credentials)
    {
        $plain = $credentials[<span>'password'</span>];

        <span>return</span> $<span>this</span>->hasher->check($plain, $user->getAuthPassword());
    }</code>

Jetzt ist es klar

Wenn Laravel das Passwort überprüft, wird das eingegebene Passwort gehasht und dann mit dem Datenbank-Passwort gespeichert Vergleich

Allerdings habe ich das Klartext-Passwort direkt in der Datenbank hinzugefügt, daher ist es natürlich, dass das Passwort falsch ist
Denken Sie daher beim Speichern des Passwortfelds unbedingt daran,

<code>Hash::make(<span>"<span>$passowrd</span>"</span>);</code>

zu verwenden, um die dem Passwort entsprechende Hash-Zeichenfolge zu generieren...
Dann habe ich einen Fehler gemeldet, als ich diese Methode zum Schreiben der Passwort-Hash-Zeichenfolge in die Datenbank verwendet habe. Nach der Überprüfung stellte sich heraus, dass das von mir festgelegte Passwortfeld zu kurz war, also änderte ich die Länge des Passwortfelds auf 1024 Wörter und das Problem war gelöst
Diese Falle hat mich den ganzen Morgen beunruhigt ... Notieren Sie sie, damit jeder sie nachschlagen kann, um nicht noch einmal so betrogen zu werden wie ich
_ (:з ∠)_

Ich habe auch einen Artikel darüber gefunden, wie man die Standardverschlüsselungsmethode von Laravel in eine benutzerdefinierte MD5-Verschlüsselungsmethode ändert. Ich habe ihn hier zur späteren Bezugnahme gepostet

(Ende)

Copyright-Erklärung: Dieser Artikel ist ein Originalartikel des Bloggers und darf nicht ohne die Erlaubnis des Bloggers reproduziert werden.

Das Obige stellt die Fallstricke vor, die bei der Anmeldeüberprüfung von 20150720 auftreten, einschließlich der relevanten Inhalte. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Programmieren lernenNächster Artikel:Programmieren lernen