配色: 字号:
Laravel 5
2016-09-12 | 阅:  转:  |  分享 
  
Laravel5.3不同用户表登陆认证

简介



Laravel5.3的Auth认证在5.2的基础上又有一些改变,本文说明如何在Laravel5.3下做不同用户表的登陆认证。



Auth认证原理简述



Laravel的认证是使用guard与provider配合完成,guard负责认证的业务逻辑,认证信息的服务端保存等;provider负责提供认证信息的持久化数据提供。

请求提交给guard,guard从provider里取出数据(类似用户名、密码等),验证输入数据与服务器端存储的数据是否吻合。如果提交的数据正确,再做session等业务的处理(如有需要)。



认证脚手架



首先我们导入Laravel的自带的认证脚手架



phpartisanmake:auth

执行数据库迁移:



phpartisanmigrate

修改Auth认证的配置文件config/auth.php



在gurads处,添加adminguard用于后台管理员认证



''guards''=>[

''web''=>[

''driver''=>''session'',

''provider''=>''users'',

],



''admin''=>[

''driver''=>''session'',

''provider''=>''admins'',

],



''api''=>[

''driver''=>''token'',

''provider''=>''users'',

],

],



在providers处添加adminsprovider,使用Admin模型



''providers''=>[

''users''=>[

''driver''=>''eloquent'',

''model''=>App\User::class,

],



''admins''=>[

''driver''=>''eloquent'',

''model''=>App\Admin::class,

],

],



创建后台管理员模型



我们再创建一个Admin模型,用于后台管理员登陆验证。



phpartisanmake:modelAdmin-m

-m参数会同时生成数据库迁移文件xxxx_create_admins_table

修改app/Admin.php模型文件






namespaceApp;



useIlluminate\Notifications\Notifiable;

useIlluminate\Foundation\Auth\UserasAuthenticatable;



classAdminextendsAuthenticatable

{

useNotifiable;



/

Theattributesthataremassassignable.



@vararray

/

protected$fillable=[

''name'',''password'',

];



/

Theattributesthatshouldbehiddenforarrays.



@vararray

/

protected$hidden=[

''password'',''remember_token'',

];

}



编辑xxxx_create_admins_table文件,后台管理员模型结构与前台用户差不多,去掉email字段,name字段设为unique






useIlluminate\Support\Facades\Schema;

useIlluminate\Database\Schema\Blueprint;

useIlluminate\Database\Migrations\Migration;



classCreateAdminsTableextendsMigration

{

/

Runthemigrations.



@returnvoid

/

publicfunctionup()

{

Schema::create(''admins'',function(Blueprint$table){

$table->increments(''id'');

$table->string(''name'')->unique();

$table->string(''password'');

$table->rememberToken();

$table->timestamps();

});

}



/

Reversethemigrations.



@returnvoid

/

publicfunctiondown()

{

Schema::dropIfExists(''admins'');

}

}



管理员模型填充数据



定义一个数据模型工厂,在database/factories/ModelFactory.php中添加如下代码



$factory->define(App\Admin::class,function(Faker\Generator$faker){

static$password;



return[

''name''=>$faker->firstName,

''password''=>$password?:$password=bcrypt(''secret''),

''remember_token''=>str_random(10),

];

});



使用Faker随机填充用户名

在database/seeds目录下生成AdminsTableSeeder.php文件。



phpartisanmake:seederAdminsTableSeeder

编辑database/seeds/AdminsTableSeeder.php文件的run方法,添加3个管理员用户,密码为123456



publicfunctionrun()

{

factory(''App\Admin'',3)->create([

''password''=>bcrypt(''123456'')

]);

}



在database/seeds/DatabaseSeeder.php的run方法里调用AdminsTableSeeder类



publicfunctionrun()

{

$this->call(AdminsTableSeeder::class);

}



执行数据库迁移命令



phpartisanmigrate--seed

数据库里会创建admins表,并且生成了3条数据



创建后台页面



创建控制器



phpartisanmake:controllerAdmin/LoginController

phpartisanmake:controllerAdmin/IndexController

其中,Admin/LoginController负责登陆逻辑;Admin/IndexController管理登陆后的首页。



编辑Admin/LoginController.php






namespaceApp\Http\Controllers\Admin;



useApp\Http\Controllers\Controller;

useIlluminate\Foundation\Auth\AuthenticatesUsers;



classLoginControllerextendsController

{

/

|--------------------------------------------------------------------------

|LoginController

|--------------------------------------------------------------------------

|

|Thiscontrollerhandlesauthenticatingusersfortheapplicationand

|redirectingthemtoyourhomescreen.Thecontrollerusesatrait

|toconvenientlyprovideitsfunctionalitytoyourapplications.

|

/



useAuthenticatesUsers;



/

Wheretoredirectusersafterlogin/registration.



@varstring

/

protected$redirectTo=''/admin'';



/

Createanewcontrollerinstance.



@returnvoid

/

publicfunction__construct()

{

$this->middleware(''guest.admin'',[''except''=>''logout'']);

}



/

显示后台登陆模板

/

publicfunctionshowLoginForm()

{

returnview(''admin.login'');

}



/

使用adminguard

/

protectedfunctionguard()

{

returnauth()->guard(''admin'');

}



/

重写验证时使用的用户名字段

/

publicfunctionusername()

{

return''name'';

}

}



编辑Admin/IndexController.php






namespaceApp\Http\Controllers\Admin;



useIlluminate\Http\Request;



useApp\Http\Requests;

useApp\Http\Controllers\Controller;



classIndexControllerextendsController

{

/

显示后台管理模板首页

/

publicfunctionindex()

{

returnview(''admin.index'');

}

}



后台显示模板



复制views/layouts/app.blade.php成views/layouts/admin.blade.php



编辑后台管理布局模板























{{config(''app.name'',''Laravel'')}}-Admin





























ToggleNavigation















{{config(''app.name'',''Laravel'')}}













 











@if(auth()->guard(''admin'')->guest())

  • Login


  • @else





    {{Auth::user()->name}}










  • onclick="event.preventDefault();

    document.getElementById(''logout-form'').submit();">

    Logout







    {{csrf_field()}}









  • @endif











    @yield(''content'')













    复制views/auth/login.blade.php成views/admin/login.blade.php



    编辑该模板,更改布局文件为layouts.admin,把表单的提交url改为admin/login,email字段改成name字段,去掉找回密码的部分



    @extends(''layouts.admin'')



    @section(''content'')









    AdminLogin





    {{csrf_field()}}



    has(''name'')?''has-error'':''''}}">

    Name









    @if($errors->has(''name''))



    {{$errors->first(''name'')}}



    @endif







    has(''password'')?''has-error'':''''}}">

    Password









    @if($errors->has(''password''))



    {{$errors->first(''password'')}}



    @endif





























    Login



















    @endsection



    复制views/home.blade.php成views/admins/index.blade.php



    编辑该模板



    @extends(''layouts.admin'')



    @section(''content'')









    Dashboard





    Youareloggedinadmindashboard!











    @endsection



    添加后台路由



    编辑routes/web.php,添加以下内容



    Route::group([''prefix''=>''admin''],function(){

    Route::group([''middleware''=>''auth.admin''],function(){

    Route::get(''/'',''Admin\Indwww.shanxiwang.netexController@index'');

    });



    Route::get(''login'',''Admin\LoginController@showLoginForm'')->name(''admin.login'');

    Route::post(''login'',''Admin\LoginController@login'');

    Route::post(''logout'',''Admin\LoginController@logout'');

    });



    后台管理认证中间件



    创建后台管理认证中间件



    phpartisanmake:middlewareAuthAdmin

    编辑AuthAdmin






    namespaceApp\Http\Middleware;



    useClosure;



    classAuthAdmin

    {

    /

    Handleanincomingrequest.



    @param\Illuminate\Http\Request$request

    @param\Closure$next

    @returnmixed

    /

    publicfunctionhandle($request,Closure$next)

    {

    if(auth()->guard(''admin'')->guest()){

    if($request->ajax()||$request->wantsJson()){

    returnresponse(''Unauthorized.'',401);

    }else{

    returnredirect()->guest(''admin/login'');

    }

    }



    return$next($request);

    }

    }



    创建后台管理登陆跳转中间件,用于有些操作在登陆之后的跳转



    phpartisanmake:middlewareGuestAdmin

    编辑该中间件的handle方法



    publicfunctionhandle($request,Closure$next)

    {

    if(Auth::guard(''admin'')->check()){

    returnredirect(''/admin'');

    }



    return$next($request);

    }



    在app/Http/Kernel.php中注册以上中间件



    protected$routeMiddleware=[

    ......

    ''auth.admin''=>\App\Http\Middleware\AuthAdmin::class,

    ''guest.admin''=>\App\Http\Middleware\GuestAdmin::class,

    ......

    ];



    处理注销



    经过上面的步骤,已经实现了前后台分离登陆,但是不管是在前台注销,还是在后台注销,都销毁了所有的session,导致前后台注销连在一起。所以我们还要对注销的方法处理一下。



    原来的logout方法是这样写的,在Illuminate\Foundation\Auth\AuthenticatesUsers里



    publicfunctionlogout(Request$request)

    {

    $this->guard()->logout();



    $request->session()->flush();



    $request->session()->regenerate();



    returnredirect(''/'');

    }



    注意这一句



    $request->session()->flush();

    将所有的session全部清除,这里不分前台、后台,所以要对这里进行改造。



    因为前台、后台注销都要修改,所以我们新建一个trait,前后台都可以使用。



    新建一个文件app/Extensions/AuthenticatesLogout.php




    namespaceApp\Extensions;



    useIlluminate\Http\Request;





    traitAuthenticatesLogout

    {

    publicfunctionlogout(Request$request)

    {

    $this->guard()->logout();



    $request->session()->forget($this->guard()->getName());



    $request->session()->regenerate();



    returnredirect(''/'');

    }

    }



    我们将上面的那一句改成



    $request->session()->forget($this->guard()->getName());

    只是删除掉当前guard所创建的session,这样就达到了分别注销的目的。



    修改Auth/LoginController.php和Admin/LoginController.php,将



    classLoginControllerextendsController

    {

    useAuthenticatesUsers;

    1

    2

    3

    改掉,在文件的前面别忘了加上use语句



    useApp\Extensions\AuthenticatesLogout;



    ...



    classLoginControllerextendsController

    {

    useAuthenticatesUsers,AuthenticatesLogout{

    AuthenticatesLogout::logoutinsteadofAuthenticatesUsers;

    }

    ...



    到这里,就完成了整个不同用户表登陆认证的过程。

    献花(0)
    +1
    (本文系网络学习天...首藏)