Assalamualaikum Warohmatulloh Wabarokatuh, seringkali saya dapat pertanyaan tentang cara membuat multi auth Laravel. Mungkin tepat rasanya jika dituliskan dalam sebuah artikel, agar mudah menjawabnya dan lebih banyak yang bisa belajar.
Tutorial ini harusnya bisa juga digunakan untuk Laravel versi 5.5, 5.6, 5.7, 5.8 dan 6. Karena tidak banyak perubahan pada struktur autentikasi pada versi tersebut.
Menginstal Laravel
Pertama kita buat sebuah projek baru Laravel tentunya, bisa gunakan perintah composer create-project.
composer create-project --prefer-dist laravel/laravel multi-auth
Atau menggunakan Laravel Installer.
laravel new multi-auth
Menginstal Laravel UI
Karena sejak Laravel 6 perintah make:auth
sudah tidak ada, maka kita harus menginstal package laravel/ui
untuk membuat auth scaffold. Jika kawan kawan menggunakan versi sebelum versi 6, lewati langkah ini.
composer require laravel/ui
Setelah terinstal jalankan perintah untuk membuat auth scaffoldingnya, kali ini saya gunakan saja Bootstrap.
php artisan ui bootstrap --auth
Dan setelahnya jangan lupa untuk menjalankan perintah untuk compile asetnya.
npm install && npm run dev
Tunggu sampai proses instal dan build selesai.
Konfigurasi Database
Selanjutnya buat sebuah database dengan nama sesuai keinginan kawan-kawan, kali ini saya akan namakan multi-auth
. Berikutnya sesuaikan konfigurasi pada file .env
.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=multi-auth
DB_USERNAME=root
DB_PASSWORD=
Membuat Migration
Karena kita akan membuat multi auth tentunya kita akan membutuhkan sebuah tabel baru, misalnya kita akan buat tabel ‘admins
‘ untuk user dengan jabatan admin.
Buat migration baru dengan perintah di bawah ini.
php artisan make:migration create_admins_table
Kemudian akan muncul file migration baru, saatnya kita sesuaikan migrationnya punya saya 2020_04_07_180057_create_admins_table.php
, nah coba dicari punya kawan-kawan. Lalu masukkan saja kode di bawah ini, yang sama persis dengan migration dari users
.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdminsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('admins', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('admins');
}
}
Begitu selesai, langsung tancap gas jalankan php artisan migrate
untuk melakukan migrasi tabel.
Membuat Model Admin
Berikutnya buat model dengan nama Admin
dengan artisan.
php artisan make:model Admin
Setelah model terbuat, lakukan perubahan kode di file model Admin
menjadi sebagai berikut.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticable;
use Illuminate\Notifications\Notifiable;
class Admin extends Authenticable
{
use Notifiable;
protected $guard = 'admin';
protected $fillable = [
'name', 'email', 'username', 'password','email_verfied_at'
];
protected $hidden = ['password'];
}
Pada model Admin
kita lihat ada $guard = 'admin'
. Itu yang akan kita sesuaikan pada file config/auth.php
. Buat sebuah guard baru dengan menambahkan kode ke dalam array guards.
'guards' => [
....
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
Berikutnya, pada bagian providers
, definisikan provider
baru untuk guard admin
, dimana untuk driver
kita gunakan eloquent dan untuk model kita gunakan model Admin
.
'providers' => [
...
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
],
Mendefinisikan Route Login Admin
Buat dua route baru untuk login admin.
Route::get('admin/login', 'Auth\AdminAuthController@getLogin')->name('admin.login');
Route::post('admin/login', 'Auth\AdminAuthController@postLogin');
Membuat Controller Untuk Fungsi Auth Admin
Buat sebuah controller untuk mengangani autentikasi admin di dalam folder Auth
atau bebas terserah kawan mau ditaruh dimana. Disini sebagai contoh agar jadi satu dengan controller auth lainnya saya buat di dalam folder Auth
.
php artisan make:controller Auth/AdminAuthController
Kemudian tulis kode di bawah ini ke class AdminAuthController
.
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
class AdminAuthController extends Controller
{
use AuthenticatesUsers;
protected $maxAttempts = 3;
protected $decayMinutes = 2;
public function __construct()
{
$this->middleware('guest:admin')->except('postLogout');
}
public function getLogin()
{
return view('auth.admin.login');
}
public function postLogin(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:5'
]);
if (auth()->guard('admin')->attempt($request->only('email', 'password'))) {
$request->session()->regenerate();
$this->clearLoginAttempts($request);
return redirect()->intended();
} else {
$this->incrementLoginAttempts($request);
return redirect()
->back()
->withInput()
->withErrors(["Incorrect user login details!"]);
}
}
public function postLogout()
{
auth()->guard('admin')->logout();
session()->flush();
return redirect()->route('admin.login');
}
}
Membuat View Login Admin
Tentu agar admin bisa login, kita buatkan sebuah tampilan form login. Tampilan ini saya copy dari file resources/views/auth/login.blade.php
dengan sedikit penyesuaian.
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Login Admin</div>
<div class="card-body">
<form method="POST" action="">
@csrf
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<div class="col-md-6 offset-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
<label class="form-check-label" for="remember">
{{ __('Remember Me') }}
</label>
</div>
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Login') }}
</button>
@if (Route::has('password.request'))
<a class="btn btn-link" href="{{ route('password.request') }}">
{{ __('Forgot Your Password?') }}
</a>
@endif
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Middleware Untuk Admin
Untuk melindungi halaman agar hanya bisa diakses oleh user yang sudah login dan dari guard admin. Kita bisa gunakan middleware auth
dengan tambahhan guard yang digunakan, untuk guard admin maka seperti ini auth:admin
.
Penulisan middleware di file route.
Route::middleware('auth:admin')->group(function(){
// Tulis routemu di sini.
});
Penulisan middleware di controller.
public function __construct()
{
$this->middleware('auth:admin');
}
Menangani Redirect
Untuk menangani redirect route yang menggunakan auth:admin
agar diarahkan ke halaman login admin, tambahkan kode di bawah ke app/Exceptions/Handler.php
.
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
$guard = Arr::get($exception->guards(), 0);
$route = 'login';
if ($guard == 'admin') {
$route = 'admin.login';
}
return redirect()->route($route);
}
Jangan lupa untuk import / use Facades Array di atas deklarasi Class.
use Illuminate\Support\Arr;
Membuat User Admin
Untuk melakukan percobaan dari proses membuat multi auth di Laravel ini, kita membutuhkan user di tabel admin
. Jadi, mari kita buat dengan seeder.
php artisan make:seeder AdminTableSeeder
Kemudian buat seedernya seperti ini.
<?php
use App\Admin;
use Illuminate\Database\Seeder;
class AdminTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Admin::create([
'name' => 'admin',
'email' => 'admin@multi-auth.test',
'password' => bcrypt(12345678),
]);
}
}
Lanjut, jalankan seedernya dengan perintah artisan ini.
php artisan db:seed --class=AdminTableSeeder
Nah sekarang kawan kawan bisa mencoba & menikmati multi auth di Laravel dengan tabel yang berbeda.
Semoga bermanfaat & bagikan ke lainnya agar manfaatnya mennyebar.
Wassalamualaikum Warohmatulloh Wabarokatuh.
Ikon Gembok dari pngtree.com
Pingback: Belajar Laravel Roles & Permission : membedakan level user