당신이 밟은 함정을 기록하면 앞으로는 함정이 점점 줄어들 것입니다...
먼저 테이블을 만듭니다:
<code><span>php</span><span>artisan</span><span>migrate</span><span>:make_admin_table</span></code>
그런 다음 작성합니다. 새 파일에서 테이블의 각 열을 설정합니다
<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>
모델 관리자 만들기:
<code>php ratisan <span>generate</span> modle Admin</code>
그런 다음 생성된 파일에
<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>
을 추가하여 설명합니다. 로그인 확인이 필요하기 때문에 laravel의 자체 인증을 사용하므로 UserInterface 및 RemindableInterface 인터페이스 사용을 추가하고 상속하고 일부 메소드를 다시 작성해야 합니다
구체적으로는 이런 문장입니다
<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>
그리고 계속해서 Auth 파일의 설정을 찾아 사용해야 할 테이블을 수정합니다
앱/config/auth.php
다음 필드를 찾아 지정한 테이블로 수정합니다.
<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>
그런 다음 컨트롤러 메서드를 추가합니다.
<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>
그런 다음 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>
드디어 경로 업데이트
<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>
위 작업을 한 후 데이터베이스를 열고 무작위로 사용자 데이터를 입력한 후 로그인을 시도했는데 문제가 발생했습니다.
무엇을 하려고 해도 계정 비밀번호가 틀리네요
바이두 구글했는데 결과가 나오지 않습니다
간절히 라라벨의 소스코드만 볼 수 밖에 없네요
가장 먼저 호출한 것은 사용자 이름과 비밀번호를 확인하는 시도 방식이었기 때문에 이 기능에 뛰어들어 살펴보았습니다
<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>
그냥 Guar의 결과인 것을 확인하는 것은 어렵지 않았습니다. ::attempt 메소드가 반환되어 계속 진행했습니다.
<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>
을 보면 아마도 hasValidCredentials 메소드에서 반환한 결과에 따라 로그인 결과가 제어되어야 함을 알 수 있을 것입니다. 그러면 내부적으로는 어떻게 구현됩니까? 들어가서 살펴보세요
<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>
다만 여기서는 $user 매개변수가 존재하는지를 판단하는 간단한 판단일 뿐이므로 계속해서 verifyCredentials 메소드로 넘어갑니다
<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>
저는 laravel을 처음 접했는데 그게 무슨 뜻인지 이해하지 못했기 때문에 계속해서 Google을 검색하다가 실제로 관련 정보를 찾았습니다.
확장된 인증 기능
이 글을 읽고 위의 코드에 대한 이해를 더해보세요
라고 표시된 디렉토리를 따르세요.
/vender/laravel/framework/src/illuminate/Auth
그래서 EloquentUserProvider.php
파일을 찾았습니다.
그 안에는 verifyCredentials 메소드의 구체적인 구현이 있습니다
<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>
이제 명확해졌습니다
laravel이 비밀번호를 확인할 때 입력된 비밀번호를 해시한 다음 데이터베이스 비밀번호와 함께 저장합니다. 비교
그런데 일반 텍스트 비밀번호를 데이터베이스에 직접 추가했기 때문에 비밀번호가 틀린 것은 당연합니다
따라서 비밀번호 필드를 저장할 때
<code>Hash::make(<span>"<span>$passowrd</span>"</span>);</code>
을 사용하여 비밀번호에 해당하는 해시 문자열을 생성해야 한다는 점을 꼭 기억하세요...
그러다가 이 방법을 사용하여 데이터베이스에 비밀번호 해시 문자열을 쓸 때 오류가 발생했다고 보고했습니다. 확인 결과 제가 설정한 비밀번호 필드가 너무 짧은 것으로 확인되어 비밀번호 필드 길이를 1024 단어로 변경했는데 문제는 다음과 같습니다. 해결
이 함정이 아침 내내 나를 괴롭혔다... 모두가 참고할 수 있도록 녹음해 두어 다시는 나처럼 사기 당하지 않도록
_ (:з ∠)_
또한 laravel의 기본 암호화 방법을 나중에 사용해야 하는 사용자 정의 MD5 암호화 방법으로 변경하는 방법에 대한 내용도 찾았습니다. Laravel은 기본 로그인 비밀번호를 변경합니다
(끝)
저작권 표시: 이 글은 블로거의 원본 글이므로 블로거의 허락 없이 복제할 수 없습니다.
위 내용은 20150720-Laravel 로그인 인증에서 겪게 되는 함정을 관련 내용을 포함하여 소개한 내용으로, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.