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

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

Ответ 1

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

    <?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 Admin Model:

  <?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 как 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';
    }

Ответ 2

Я только что сделал это в своем проекте для двух таблиц: 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\[email protected]');
    Route::post('/admin/login','AdminAuth\[email protected]');
    Route::get('/admin/logout','AdminAuth\[email protected]');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\[email protected]');
    Route::post('admin/register', 'AdminAuth\[email protected]');

    Route::get('/admin', '[email protected]');

});  

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

создание промежуточного программного обеспечения для 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

Ответ 3

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

В 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)

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

Ответ 4

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

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

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

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

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

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

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

Может ли кто-нибудь объяснить Laravel 5.2 Multi Auth с примером

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

Ответ 5

Внедрить 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\[email protected]');
    Route::post('/admin/login','AdminAuth\[email protected]');
    Route::get('/admin/logout','AdminAuth\[email protected]');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\[email protected]');
    Route::post('admin/register', 'AdminAuth\[email protected]');

    Route::get('/admin', '[email protected]');

});  

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

создание промежуточного программного обеспечения для 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()  

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

Ответ 6

Создайте модель таблицы таблиц менеджеров и администраторов. Эта модель должна расширять 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');
}

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