Berikut ini adalah contoh aplikasi yang menggunakan konsep multiple auth. Multiple auth di sini diimplementasikan dalam bentuk multiple guard.
Aplikasi ini memiliki 3 guard yakni web, admin dan writer. 3 guard ini juga terhubung ke 3 model yang berbeda. Guard web terhubung ke User model, guard admin terhubung ke Admin model, guard writer terhubung ke Writer model.
Kita bisa lihat konfigurasinya pada file auth.php
di dalam folder config.
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'writer' => [
'driver' => 'session',
'provider' => 'writers',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
'writers' => [
'driver' => 'eloquent',
'model' => App\Writer::class,
],
],
Kemudian, di Writer dan Admin model juga harus memasang nilai pada property $guard
agar eksplisit.
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Writer extends Authenticatable
{
use Notifiable;
protected $guard = 'writer';
//...
}
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
use Notifiable;
protected $guard = 'admin';
//...
}
Untuk mengakses data writer yang sedang login bisa dilakukan dengan perintah berikut.
\Auth::guard('writer')->user()->name;
// atau
auth('writer')->user()->name;
Untuk mengakses data admin yang sedang login pun juga sama dengan perintah berikut.
\Auth::guard('admin')->user()->name;
// atau
auth('admin')->user()->name;
Untuk mengakses data user kita tidak perlu memasukkan parameter ke dalam method guard
ataupun di dalam helper auth
. Sehingga aksesnya pun seperti di bawah ini.
\Auth::guard()->user()->name;
// atau
auth()->user()->name;
Untuk memproteksi halaman yang hanya bisa diakses baik writer, admin dan user, kita bisa masukkan perintah middleware ke dalam file routes.
Route::view('/home', 'home')->middleware('auth');
Route::view('/admin', 'admin')->middleware('auth:admin');
Route::view('/writer', 'writer')->middleware('auth:writer');
Kemudian, kita perlu mengatur bagaimana user di arahkan ke halaman login berdasarkan guard yang sudah kita pasang. Caranya adalah memodifikasi method handle()
yang ada di dalam class middleware RedirectIfAuthenticated.php
.
// app/Http/Controllers/Middleware/RedirectIfAuthenticated.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
public function handle($request, Closure $next, $guard = null)
{
if ($guard == "admin" && Auth::guard($guard)->check()) {
return redirect('/admin');
}
if ($guard == "writer" && Auth::guard($guard)->check()) {
return redirect('/writer');
}
if (Auth::guard($guard)->check()) {
return redirect('/home');
}
return $next($request);
}
}
Dengan adanya fitur multiple guard di Laravel sejak versi 5.2 memudahkan Anda untuk melakukan multiple Auth dan data auth user akan diakses terpisah berdasarkan guard yang didefinisikan sebelumnya.
- Clone repository.
- Jalankan
composer install
. - Pastikan sudah ada file
.env
dan buat database bernamamultiauth.sql
. - Jalankan
php artisan migrate
. - Jalankan
php artisan db:seed
. - Jalankan
php artisan serve
. - Buka halaman
/home
maka akan diarahkan ke halaman login user. Masukkan email[email protected]
dan password adalahsecret
. - Buka halaman
/admin
maka akan diarahkan ke halaman login admin. Masukkan email[email protected]
dan password adalahsecret
. - Buka halaman
/writer
maka akan diarahkan ke halaman login admin. Masukkan email[email protected]
dan password adalahsecret
.