Аутентификация пользователей из более чем двух таблиц в laravel 5


Как я знаю, Auth::attempt используется для аутентификации пользователей из таблицы users, но я хочу аутентифицировать других пользователей из таблицы managers и администратора из таблицы admins. Я знаю, что уже существует плагин laravel-multiauth. Но можем ли мы создать свой собственный AuthServiceProvider для аутентификации пользователей из нескольких таблиц..?

Author: RAUSHAN KUMAR, 2017-09-19

6 answers

Я только что сделал это в своем проекте для двух таблиц, а именно users и admin, но вы можете сделать то же самое для более чем двух таблиц.
Давайте посмотрим

Как создать наш собственный AuthServiceProvider для аутентификации пользователей из нескольких таблиц

У меня есть две таблицы admin и users

Сначала создайте базовый логин/регистрацию route, view и controller для таблицы user с помощью команды Laravel 5.2 artisan.

php artisan make:auth

Давайте создадим таблицу admin как users таблица.

Контроллер Для Административной Части
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(Просто скопировал эти файлы из app/Http/Controllers/Auth/AuthController здесь)

config/auth.php

//Authenticating guards
'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

//User Providers
'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],  

//Resetting Password  
'passwords' => [
    'clients' => [
        'provider' => 'client',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'admins' => [
        'provider' => 'admin',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],  

route.php

Route::group(['middleware' => ['web']], function () {
    //Login Routes...
    Route::get('/admin/login','AdminAuth\AuthController@loginPage');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\AuthController@registrationPage');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');

});  

AdminAuth/AuthController.php

Добавьте два метода и укажите $redirectTo и $guard

protected $redirectTo = '/admin';
protected $guard = 'admin';
public function loginPage()
{
    if (view()->exists('auth.authenticate')) {
        return view('auth.authenticate');
    }

    return view('admin.auth.login');
}
public function registrationPage()
{
    return view('admin.auth.register');
}  

Это поможет вам открыть другую форму входа для администратора

Создание промежуточного программного обеспечения для admin

class RedirectIfNotAdmin
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @param  string|null  $guard
 * @return mixed
 */
public function handle($request, Closure $next, $guard = 'admin')
{
    if (!Auth::guard($guard)->check()) {
        return redirect('/');
    }

    return $next($request);
}

}

Зарегистрировать промежуточное программное обеспечение в kernel.php

 protected $routeMiddleware = [
    'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
];

Используйте это промежуточное программное обеспечение в AdminController , например,

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{
    public function __construct(){
        $this->middleware('admin');
   }
public function index(){
        return view('admin.dashboard');
    }
}

Аутентификация
Мы можем получить доступ к аутентифицированному пользователю напрямую с помощью
Auth::user() но если у вас есть две таблицы аутентификации, то вам придется использовать

Auth::guard('guard_name')->user()  

Как
Auth::guard('admin')->user()

А также для справки проверьте это https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1

 7
Author: Bibhudatta Sahoo, 2017-09-26 08:13:49

Попробуйте мою идею, если хотите. Я ожидаю, что разные table имеют разные users. Потому что это не сработает, если у вас есть то же самое user в других таблицах.

  1. Выберите таблицу приоритетов (например, пользователи)
  2. Добавьте условие
    • if(Auth::user(attempt(...))
    • elseif(Auth::manager(attempt(...))
    • elseif(Auth::admins(attempt(...)))

Примечание: Ваша таблица приоритетов здесь users, затем, если пользователь не существует в этой таблице, он попробует таблицу managers, затем, если она все еще не существует, она будет проверьте таблицу admins, в противном случае (используйте else) верните сообщение об ошибке.

Другой вариант:

Другой вариант - использовать этот пакет sarav/laravel-multiauth. Вы можете следить за этой нитью. Как использовать аутентификацию для нескольких таблиц в Laravel 5 для получения дополнительной информации.

Дополнительная ссылка:

Https://laracasts.com/discuss/channels/general-discussion/using-laravel-auth-for-multiple-tables?page=1

Кто-нибудь может объяснить Laravel 5.2 Мультиавторизация с примером

Https://laracasts.com/discuss/channels/laravel/52-auth-multiple-tables?page=1

 7
Author: Jonjie, 2017-09-21 05:49:10

Вы можете настроить несколько защитников аутентификации, у каждого из которых есть свой поставщик. Поставщики определяют таблицу или модель, которые будут использоваться.

В config/auth.php вы настраиваете providers следующим образом, а также настраиваете соответствующие guards для каждого из этих поставщиков:

'providers' => [
    'users'  => [
        'driver' => 'eloquent',
        'model'  => App\User::class,
    ],
    'managers'  => [
        'driver' => 'eloquent',
        'model'  => App\Manager::class,
    ],
    'admins'  => [
        'driver' => 'eloquent',
        'model'  => App\Admin::class,
    ]
]

Затем вы можете пройти аутентификацию следующим образом:

Auth::attempt($credentials) // use default guard for simple users
Auth::guard('manager')->attempt($credentials)
Auth::guard('admin')->attempt($credentials)

Ознакомьтесь с документами здесь.

 7
Author: achillesp, 2017-09-21 08:27:37

Сначала создайте аутентифицируемого администратора в Illuminate\Foundation\Auth, как

    <?php

namespace Illuminate\Foundation\Auth;
use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

    class Admin extends Model implements
        AuthenticatableContract,
        AuthorizableContract,
        CanResetPasswordContract
    {
        use Authenticatable, Authorizable, CanResetPassword;
    }

Затем создайте модель администратора, расширив Authenticatable Модель администратора:-

  <?php
namespace App;
use Illuminate\Foundation\Auth\Admin as Authenticatable;

class Admin extends Authenticatable
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

После этого вам нужно изменить config/auth.php, как показано ниже Добавить в поставщиков массив

'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ], 

И Добавьте в массив охранников .

 'user' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
 'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],

Теперь для аутентификации от пользователя таблицы

 if (Auth::guard('user')->attempt(['email' => $email, 'password' => $password])) {
        $details = Auth::guard('user')->user();
        $user = $details['original'];
        return $user;
    } else {
        return 'auth fail';
    }

Подтвердить из Администратора таблицы

 if (Auth::guard('admin')->attempt(['email' => $email, 'password' => $password])) {
        $details = Auth::guard('admin')->user();
        $user = $details['original'];
        return $user;
    } else {
        return 'auth fail';
    }
 5
Author: Shams Reza, 2017-09-27 06:33:47

Реализовать Multi Auth в Larvel 5.2

Я рассматриваю две таблицы admin и users

В Laravel 5.2 появилась новая команда artisan.

php artisan make:auth

Он создаст базовый логин/регистрацию route, view и controller для таблицы пользователей.

Для простоты создайте таблицу admin в виде таблицы users.

Контроллер Для Admin

app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController

(примечание: Я только что скопировал эти файлы из app/Http/Controllers/Auth/AuthController здесь)

config/auth.php

//Authenticating guards
'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

//User Providers
'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],  

//Resetting Password  
'passwords' => [
    'clients' => [
        'provider' => 'client',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'admins' => [
        'provider' => 'admin',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],

route.php

Route::group(['middleware' => ['web']], function () {
    //Login Routes...
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');

});  

AdminAuth/AuthController.php

Добавьте два метода и укажите $redirectTo и $guard

protected $redirectTo = '/admin';
protected $guard = 'admin';
public function showLoginForm()
{
    if (view()->exists('auth.authenticate')) {
        return view('auth.authenticate');
    }

        return view('admin.auth.login');
    }

    public function showRegistrationForm()
    {   
        return view('admin.auth.register');
    }  

Это поможет вам открыть другую форму входа для администратора

Создание промежуточного программного обеспечения для admin

class RedirectIfNotAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = 'admin')
    {
        if (!Auth::guard($guard)->check()) {
            return redirect('/');
        }

        return $next($request);
    }
}

Зарегистрировать промежуточное программное обеспечение в kernel.php

 protected $routeMiddleware = [
    'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
];

Используйте это промежуточное программное обеспечение в AdminController, например,

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{
    public function __construct(){
        $this->middleware('admin');
   }

   public function index(){
        return view('admin.dashboard');
    }
}

Это все, что нужно для того, чтобы он работал, а также для получения json аутентифицированного администратора

Auth::guard('admin')->user()

Мы можем доступ к аутентифицированному пользователю напрямую с помощью

Auth::user() но если у вас есть две таблицы аутентификации, то вы должны использовать

Auth::guard('guard_name')->user()  

Для выхода из системы

Auth::guard('guard_name')->user()->logout()

Для аутентифицированного пользователя json

Auth::guard('guard_name')->user()  

Надеюсь, это поможет.

 4
Author: Nitish Kumar, 2017-09-19 08:19:19

Создайте модель для таблицы менеджеров и таблицы администраторов. Эта модель должна расширять Illuminate\Foundation\Auth\User

В config/auth.php,

Добавить в массив поставщиков:

'managers' => [
    'driver' => 'eloquent',
    'model' => App\Manager::class,
 ],

Добавить в массив охранников:

'web_manager' => [
    'driver' => 'session',
    'provider' => 'managers',
 ],

Тогда. в LoginController (создайте его для менеджера с помощью php artisan make:auth) используйте признак Illuminate\Foundation\Auth\AuthenticatesUsers и переопределите свойства защиты и перенаправления.

protected $redirectTo = 'redirect_path_after_manager_login';

protected function guard()
{
  return Auth::guard('web_manager');
}

Модель менеджера аутентифицирована, и вы можете получить объект аутентифицированного менеджера Auth::guard('web_manager')->user();

 3
Author: Sanzeeb Aryal, 2017-09-28 01:49:40