Чи може хто-небудь пояснити Laravel 5.2 Multi Auth із прикладом


172

Я намагаюся аутентифікувати користувачів та таблицю форм та адмініструвальник відповідно форми. Я використовую модель, яку надав laravel з коробки, і створив таку ж, я додав ключ захисту та ключ провайдера вuseradminUserAdmin.auth.php.

Охоронці

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

Постачальники

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

Маршрути

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');
});

Я створив каталог, який називається AuthAdminLaravel за замовчуванням AuthController.phpта PasswordController.phpфайлами. (Простір імен відповідно змінено)

Перш за все, у документах Ларавеля згадувалося, як вказати користувацький захист при автентифікації на зразок цього, який не працює.
введіть тут опис зображення

Існує ще один метод, згаданий у документах Laravel, щоб використовувати охоронець, який теж не працює.

введіть тут опис зображення

Було б корисно, якби хтось міг вирішити проблеми та виправити мене, якщо я не прав.


Laravel виправив помилку у версії 5.2.6. protected $guard = 'guard_name'можна використовувати зараз.
імреалашу

У Laravel доступно багато пакетів генераторів панелей адміністратора. Я віддаю перевагу Voyager Admin. Встановити їх легко і легко. Це може заощадити тону коду. Вам просто потрібно зрозуміти, як це працює. Не винаходити колесо. Voyager - Пропавший адміністратор
sathish R

Відповіді:


201

Після багатьох копань та безлічі запитань та відповідей я нарешті зумів працювати з Laravel 5.2 Multi Auth з двома таблицями, тому я пишу відповіді на власне запитання.

Як реалізувати Multi Auth в Larvel 5.2

Як зазначено вище. Дві таблиці adminтаusers

У Laravel 5.2 є нова artisanкоманда.

php artisan make:auth

він буде генерувати базовий логін / регістр route, viewі controllerдля userтаблиці.

Складіть 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@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()

Редагувати - 1
Ми можемо отримати доступ до автентифікованого користувача безпосередньо за допомогою,
Auth::user() але якщо у вас є дві таблиці аутентифікації, вам доведеться використовувати

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

для виходу

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

для автентифікованого користувача json

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

Редагувати 2

Тепер ви можете завантажити проект Laravel 5.2 Multiauth, реалізований http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/


велике спасибі людині, це те, що я шукав, він працював з litle біт модифікації. велике спасибі +1 за Q та +1 за Ans, бажаю, щоб я міг ще +1. велике спасибі ..
rummykhan

@imrealashu, Як я створив проект відповідно до вашої відповіді. Але це генерує помилку декількох класів з однаковою назвою. Так що з цим? Якщо я змінюю ім'я класу для адміністратора auth, то де мені потрібно змінити?
Акшай Вагасія

1
Ви можете також пояснити, як "Скинути пароль" для охорони адміністратора.
Shoaib Rehan

1
Спасибі за відмінне пояснення було мені дуже корисно всьому. Щоб скористатися гостям програмного забезпечення, змініть файл RedirectIfAuthenticated.php у такий рядок: Оригінал: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } Після зміни: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Крістіан Меза

1
@Jeffz це лише через погану документацію та відсутність робочих прикладів на кілька авторів .. ми очікуємо гарної документації, і так, нові цікаві функції цього оновлення 5.3.
imrealashu

2

Якщо це допомагає комусь, і це може бути пов’язано з моїм нерозумінням проміжного програмного забезпечення, ось що мені довелося зробити, щоб це працювало (крім кроків, зроблених @imrealashu) ...

В route.php:

Route::get('/admin', [
  'middleware' => 'admin',
  'uses' => 'AdminController@index'
]);

Це в групі webпроміжних програм. До цього я намагався розмістити його в окремій програмі середнього adminпрограмного забезпечення та навіть у auth:adminгрупі, але це не спрацювало, воно працювало для мене лише тоді, коли я вказав проміжне програмне забезпечення як адміністратор у самому маршруті. Я поняття не маю, чому це, але сподіваюся, що це рятує інших від виривання волосся, як я.


Я завантажив ваш multi-aut zip-файл, замінений на існуючі файли проекту, тоді, коли я переміщую свою БД, ця помилка показує .. [Symfony \ Component \ Console \ Exception \ RuntimeException] Не вистачає аргументів (відсутні: "ім'я").
G Naga Subrahmanyam

Насправді для мене адміністратор входить у систему, але не перенаправляється на адміністратор. Виконавши це, ви можете, скажіть, чому так? Мені потрібно зареєструвати інші маршрути, як це можливо, Route::group(['middleware' => ['admin']], function () { //Admin Routes... });тому що це не працює для мене
Leap Hawk

0

У laravel 5.6 це дуже просто. Просто перейдіть config/auth.phpі додайте цей рядок у providersмасив:

'admins' => [
   'driver' => 'database',
   'table' => 'admin_table'
]

Зауважте, що ми не використовували databaseдрайвер eloquent.

Тепер додайте це до guardsмасиву:

'admin_guard' => [
   'driver' => 'session',
   'provider' => 'admins'
]

Тепер ми закінчили! Використовуйте це під час роботи з таблицею адміністраторів:

Auth::guard('admin_guard')->User();

Ура.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.