How to use authentication for multiple tables in Laravel 5

前端 未结 2 1180
伪装坚强ぢ
伪装坚强ぢ 2020-12-01 15:22

Sometimes, we\'d like to separate users and admins in different 2 tables.
I think it is a good practice.

I am looking if that is possible in Laravel 5.

相关标签:
2条回答
  • 2020-12-01 15:51

    I have created a laravel package where you can handle multiple authentication.

    Step 1 : Composer require

    Firstly, composer require the multiauth package

    composer require sarav/laravel-multiauth dev-master
    

    Step 2 : Replacing default auth service provider

    Replace

    Illuminate\Auth\AuthServiceProvider::class
    

    with

    Sarav\Multiauth\MultiauthServiceProvider
    

    in your config/app.php file

    Step 3 : Modify auth.php

    Modify your config/auth.php file to something like this

    'multi' => [
        'user' => [
            'driver' => 'eloquent',
            'model'  => App\User::class,
            'table'  => 'users'
        ],
    'admin' => [
        'driver' => 'eloquent',
        'model'  => App\Admin::class,
        'table'  => 'admins'
       ]
    ],
    

    Thats it! Now you can try multiple authentication by passing the user as first parameter. For example

    \Auth::loginUsingId("user", 1); // Login user with id 1
    
    \Auth::loginUsingId("admin", 1); // Login admin with id 1
    
    // Attempts to login user with email id johndoe@gmail.com 
    \Auth::attempt("user", ['email' => 'johndoe@gmail.com', 'password' => 'password']);
    
    // Attempts to login admin with email id johndoe@gmail.com
    \Auth::attempt("admin", ['email' => 'johndoe@gmail.com', 'password' => 'password']); 
    

    For more detailed documentation

    http://sarav.co/blog/multiple-authentication-in-laravel/

    http://sarav.co/blog/multiple-authentication-in-laravel-continued/

    0 讨论(0)
  • 2020-12-01 16:12

    Before reading the following, you are supposed to have basic knowledge on ServiceProvider, Facade and IoC in Laravel 5. Here we go.

    According to the doc of Laravel, you could find the Facade 'Auth' is refering to the Illuminate\Auth\AuthManager, which has a magic __call(). You could see the major function is not in AuthManager, but in Illuminate\Auth\Guard

    Guard has a Provider. This provider has a $model property, according to which the EloquentUserProvider would create this model by "new $model". These are all we need to know. Here goes the code.

    1.We need to create a AdminAuthServiceProvider.

    public function register(){
        Auth::extend('adminEloquent', function($app){
            // you can use Config::get() to retrieve the model class name from config file
            $myProvider = new EloquentUserProvider($app['hash'], '\App\AdminModel') 
            return new Guard($myProvider, $app['session.store']);
        })
        $app->singleton('auth.driver_admin', function($app){
            return Auth::driver('adminEloquent');
        });
    }
    

    2.Facade:

    class AdminAuth extends Facade {
            protected static function getFacadeAccessor() { return 'auth.driver_admin'; }
        }
    

    3. add the alias to Kernel:

    'aliases' => [
        //has to be beneath the 'Auth' alias
        'AdminAuth' => '\App\Facades\AdminAuth'
    ]
    

    Hope this could be helpful.

    0 讨论(0)
提交回复
热议问题