Adakah yang Bisa Menjelaskan Laravel 5.2 Multi Auth dengan Contoh

172

Saya mencoba masing-masing untuk mengotentikasi pengguna dan admin bentuk usertabel dan admintabel. Saya menggunakan Usermodel seperti yang disediakan oleh laravel di luar kotak dan menciptakan yang sama karena Admin.saya telah menambahkan kunci penjaga dan kunci penyedia keauth.php.

Penjaga

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

Penyedia

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

Rute

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

Saya telah membuat direktori bernama AuthAdmintempat Laravel's default AuthController.phpdan PasswordController.phpfile ada. (Namespace Diubah sesuai)

Pertama-tama, dalam dokumen Laravel disebutkan bahwa cara menentukan penjaga kustom sambil mengautentikasi seperti ini yang tidak berfungsi.
masukkan deskripsi gambar di sini

Ada metode lain yang disebutkan dalam dokumen Laravel untuk menggunakan penjaga yang tidak berfungsi juga.

masukkan deskripsi gambar di sini

Akan bermanfaat jika seseorang dapat menyelesaikan masalah dan mengoreksi saya jika saya salah.

imrealashu
sumber
Laravel memperbaiki bug di versi 5.2.6. protected $guard = 'guard_name'dapat digunakan sekarang.
imrealashu
Di Laravel ada banyak paket generator panel Admin yang tersedia. Saya lebih suka Admin Voyager. Memasangnya dengan mudah dan mudah. Ini dapat menghemat banyak kode. Anda hanya perlu memahami cara kerjanya. Jangan menemukan kembali roda. Voyager - Admin Hilang Laravel Aplikasi Laravel dengan gentelella bootstrap admin tempalte.
sathish R

Jawaban:

201

Setelah banyak menggali dan banyak pertanyaan & jawaban akhirnya saya berhasil bekerja Laravel 5.2 Multi Auth dengan dua tabel, Jadi saya menulis Jawaban atas Pertanyaan saya sendiri.

Bagaimana cara mengimplementasikan Multi Auth di Larvel 5.2

Seperti yang disebutkan di atas. Dua meja admindanusers

Laravel 5.2 memiliki artisanperintah baru .

php artisan make:auth

itu akan menghasilkan login dasar / daftar route, viewdan controlleruntuk usertabel.

Jadikan admintabel sebagai userstabel untuk kesederhanaan.

Kontroler Untuk Admin
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(catatan: Saya baru saja menyalin file-file ini dari app/Http/Controllers/Auth/AuthControllersini)

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

Tambahkan dua metode dan tentukan $redirectTodan$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');
}  

ini akan membantu Anda untuk membuka formulir login lain untuk admin

membuat middleware untuk 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);
}

}

daftar middleware di kernel.php

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

gunakan middleware ini di AdminController misalnya,

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

Itu semua diperlukan untuk membuatnya bekerja dan juga untuk mendapatkan json penggunaan admin terotentikasi
Auth::guard('admin')->user()

Sunting - 1
Kami dapat mengakses pengguna terotentikasi secara langsung menggunakan
Auth::user() tetapi jika Anda memiliki dua tabel otentikasi maka Anda harus menggunakan

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

untuk keluar

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

untuk pengguna json terotentikasi

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

Edit 2

Sekarang Anda dapat mengunduh Laravel 5.2 Project diimplementasikan Multiauth http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/

imrealashu
sumber
terima kasih banyak pria, ini adalah apa yang saya cari, itu bekerja dengan sedikit modifikasi. terima kasih banyak +1 untuk Q dan +1 untuk Ans, berharap saya bisa memberi +1 lebih banyak. terima kasih banyak ..
rummykhan
@imrealashu, Karena saya telah membuat proyek sesuai jawaban Anda. Tetapi menghasilkan kesalahan beberapa kelas dengan nama yang sama. Jadi bagaimana dengan itu? Jika saya mengubah nama kelas untuk auth admin, lalu di mana saya perlu melakukan perubahan?
Akshay Vaghasiya
1
dapatkah Anda juga menjelaskan cara "Reset Kata Sandi" untuk penjaga admin.
Shoaib Rehan
1
Terima kasih atas penjelasannya yang luar biasa yang sangat berguna bagi saya semuanya. Untuk menggunakan tamu middleware, ubah file RedirectIfAuthenticated.php dengan baris berikut: Asli: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } Setelah perubahan: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Cristian Meza
1
@ Jeffz ini hanya karena dokumentasi yang buruk dan tidak ada contoh yang berfungsi pada multi-auth .. kami mengharapkan dokumentasi yang bagus dan ya fitur-fitur keren baru pada pembaruan 5.3 ini.
imrealashu
2

Dalam hal ini membantu siapa pun, dan ini mungkin hanya karena kurangnya pemahaman saya tentang middleware, inilah yang harus saya lakukan untuk membuat ini berfungsi (selain langkah-langkah yang diambil oleh @imrealashu) ...

Di route.php:

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

Ini ada di webgrup middleware. Sebelum ini saya mencoba meletakkannya di admingrup middleware terpisah dan bahkan dalam sebuah auth:admingrup tetapi ini tidak berhasil, itu hanya bekerja untuk saya ketika saya menetapkan middleware sebagai admin pada rute itu sendiri. Saya tidak tahu mengapa ini tapi saya berharap itu menyelamatkan orang lain dari mencabut rambut mereka seperti yang saya lakukan.

Sworrub Wehttam
sumber
Saya mengunduh file zip multi-auth Anda diganti dengan file proyek ezisting lalu ketika saya memigrasi DB kesalahan saya ini menunjukkan [Symfony \ Component \ Console \ Exception \ RuntimeException] Tidak cukup argumen (hilang: "nama").
G Naga Subrahmanyam
Sebenarnya bagi saya admin login tetapi tidak diarahkan ke admin. Setelah melakukan ini, bisakah Anda menjelaskan mengapa demikian? Saya harus mendaftarkan rute lain karena mungkin dengan Route::group(['middleware' => ['admin']], function () { //Admin Routes... });alasan itu tidak berfungsi untuk saya
Leap Hawk
0

Sangat mudah di laravel 5.6. Cukup buka config/auth.phpdan tambahkan baris ini dalam providersarray:

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

Perhatikan bahwa kami tidak menggunakan databasedriver eloquent.

Sekarang tambahkan ini ke guardsarray:

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

Sekarang kita sudah selesai! Gunakan ini ketika bekerja dengan tabel admin:

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

Bersulang.

Langit
sumber