Bagian 1 : Registrasi
Pendahuluan
Pada bagian ini kita tidak akan membahas tentang authentikasi laravel secara umum, disini kita akan bahas tentang multi atuh yang bisa kita buat pada laravel.
Mungkin kalian pernah mendengar tentang fitur authentication guard yang luar biasa pada laravel dan bagaimana cara menggunakannya untuk mengauthentikasi multiple user proviser / model. tapi tidak tau bagaimana cara memulainya. Jangan khawatir kita akan membahas setiap bagian secara rinci tentang session berbasis MultiAuth.
Untuk yang sudah faham atau terbiasa menggunakan laravel dapat melanjutkan membaca tutorial ini, tapi bagi yang belum familiar dengan laravel framework silahkan membaca terlebih dahulu dokumentasi resminya disini
Authentication pada Laravel 5.5
Kenapa kita membutuhkan MultiAuth?
Terkadang kita ingin memisahkan antara logic authentikasi user dengan admin dan sebagainya, beberapa developer berpendapat tidak perlu memisahkan logic authentikasinya cukup role dan permissionnya saja yang dibedakan, akan tetapi ada suatu kondisi ketika kita ingin memisahkan role dan permission hanya untuk grup authentikasi tertentu dengan tidak mencampurnya dengan model / table pada default user dan kebutuhan ini lah yang akan kita bahas pada tulisan kali ini.
Bagian 1. Registrasi
Bagian pertama yang akan kita bahas adalah registrasi, kenapa registrasi? karena registrasi merupakan awalan dari semua proses, akan tetapi jika kalian tidak menginginkan ada proses registrasi untuk authentikasi ini silahkan dilewatkan saja bagian ini.
Tutorial ini dibuat sedemikian rupa agar dapat digunakan juga pada versi" dibawahnya seperti 5.2, 5.3, 5.4 dan 5.5. sehingga kalian yang menggunakan versi dibawahnya tidak perlu khawatir karena masi compatible untuk dipergunakan.
langkah awal jika kalian menginstall laravel dari awal maka kita akan menjalankan perintah authentication scaffolding terlebih dahulu.
Berikutnya kita akan membuat model baru dan melakukan migrasi pada user admin tersebutphp artisan make:auth
Buka file admin migration dan tambahkan keterangan kolom berikut :php artisan make:model Admin -m
public function up()
{
Schema::create('sellers', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('sellers');
}
Sekarang kita dapat menjalankan migrations. perintah ini akan membentuk admins tableSetelah selesai mari menambahkan beberapa route untuk registrasi, buka routes/web.php dan tambahkan script berikut ini.php artisan migrate
//web.php
Route::get('admin_register', 'AdminAuth\RegisterController@showRegistrationForm');
Route::post('
admin
_register', '
Admin
Auth\RegisterController@register');
Route::get('/
admin
_home', function(){
return view('
admin
.home');
});
Anda dapat mengganti admin dengan lainnya sesuai kebutuhan misal : sales, finance dll. tapi yang harus diperhatikan adalah anda harus tetap konsisten dengan penamaannya supaya tidak terjadi kebingungan.Sekarang kita akan membuat RegisterController untuk admin
Setelah terbentuk, kita akan melakukan beberapa perubahan / penambahan pada script tersebutphp artisan make:controller SellerAuth/RegisterController
Langkah pertama adalah menambahkan fungsi showRegistrationForm()
//RegisterController.php
namespace App\Http\Controllers\AdminAuth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class RegisterController extends Controller
{
//shows registration form to admin
public function showRegistrationForm()
{
return view('admin.auth.register');
}
}
Lalu kita buat viewnya, dengan terlebih dahulu menambahkan folder admin pada folder resources/views hal pertama adalah kita buat layout.blade.php sebagai main templatenya Berikut struktur filenya.
Berikut script layout.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'MultiAuth') }}</title>
<!-- Styles -->
<link href="/css/app.css" rel="stylesheet">
<!-- Scripts -->
<script>
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>
</script>
</head>
<body>
<div id="app">
<nav class="navbar navbar-default navbar-static-top">
<div class="container">
<div class="navbar-header">
<!-- Collapsed Hamburger -->
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#app-navbar-collapse">
<span class="sr-only">Toggle Navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!-- Branding Image -->
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
</div>
<div class="collapse navbar-collapse" id="app-navbar-collapse">
<!-- Left Side Of Navbar -->
<ul class="nav navbar-nav">
</ul>
<!-- Right Side Of Navbar -->
<ul class="nav navbar-nav navbar-right">
<!-- Authentication Links -->
@if (Auth::guard('web_seller')->guest())
<!--Seller Login and registration Links -->
<li><a href="{{ url('/seller_login') }}">Admin Login</a></li>
<li><a href="{{ url('/seller_register') }}">
Admin
Registration</a></li>
@else
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
{{ Auth::guard('web_admin')->user()->name }} <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="{{ url('/seller_logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Logout
</a>
<form id="logout-form" action="{{ url('/seller_logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
</li>
</ul>
</li>
@endif
</ul>
</div>
</div>
</nav>
@yield('content')
</div>
<!-- Scripts -->
<script src="/js/app.js"></script>
</body>
</html>
Langkah berikutnya kita akan membuat register.blade.php view ini diletakkan pada folder admin/auth
@extends('admin.layouts')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-success">
<div class="panel-heading">Register A Admin</div>
<div class="panel-body">
<form class="form-horizontal" role="form" method="POST" action="{{ url('/admin_register') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}">
<label for="name" class="col-md-4 control-label">Name</label>
<div class="col-md-6">
<input id="name" type="text" class="form-control" name="name" value="{{ old('name') }}" required autofocus>
@if ($errors->has('name'))
<span class="help-block">
<strong>{{ $errors->first('name') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
<label for="email" class="col-md-4 control-label">E-Mail Address</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required>
@if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
<label for="password" class="col-md-4 control-label">Password</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control" name="password" required>
@if ($errors->has('password'))
<span class="help-block">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<label for="password-confirm" class="col-md-4 control-label">Confirm Password</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required>
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-success">
Register Seller
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Sekarang kita akan bekerja dengan route Route::post('admin_register', 'AdminAuth\RegisterController@register') dimana route tersebut akan menangani data post dari register view. dan jangan lupa membuat methode register() pada RegisterController
//RegisterController.php
namespace App\Http\Controllers\AdminAuth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class RegisterController extends Controller
{
//shows registration form to admin
public function showRegistrationForm()
{
return view('admin.auth.register');
}
//Handles registration request for admin
public function register(Request $request)
{
//Validates data
$this->validator($request->all())->validate();
//Create admin
$seller = $this->create($request->all());
//Authenticates admin
$this->guard()->login($seller);
//Redirects admin
return redirect($this->redirectPath);
}
}
Langkah pertama yang dikerjakan dengan methode ini adalah memvalidasi request yang dikirim dari view register melalui validator() methode. maka kita juga harus membuat methode validator() pada RegisterController.
//RegisterController.php
namespace App\Http\Controllers\AdminAuth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
//Validator facade used in validator method
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller
{
//shows registration form to seller
public function showRegistrationForm()
{
return view('admin.auth.register');
}
//Handles registration request for
admin
public function register(Request $request)
{
//Validates data
$this->validator($request->all())->validate();
//Create
admin
$seller = $this->create($request->all());
//Authenticates
admin
$this->guard()->login($
admin
);
//Redirects
admin
return redirect($this->redirectPath);
}
//Validates user's Input
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:sellers',
'password' => 'required|min:6|confirmed',
]);
}
}
Ok, kita lanjutkan kelangkah berikutnya yaitu dengan membuat methode register() untuk membentuk admin. Kita juga harus mendeklarasikan methode create() pada RegisterController
//RegisterController.php
namespace App\Http\Controllers\AdminAuth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
//Validator facade used in validator method
use Illuminate\Support\Facades\Validator;
//Admin Model
use App\Admin;
class RegisterController extends Controller
{
//shows registration form to admin
public function showRegistrationForm()
{
return view('
admin
.auth.register');
}
//Handles registration request for
admin
public function register(Request $request)
{
//Validates data
$this->validator($request->all())->validate();
//Create
admin
$seller = $this->create($request->all());
//Authenticates
admin
$this->guard()->login($
admin
);
//Redirects
admin
return redirect($this->redirectPath);
}
//Validates user's Input
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:sellers',
'password' => 'required|min:6|confirmed',
]);
}
//Create a new
admin
instance after a validation.
protected function create(array $data)
{
return Admin::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}
Laravel authentication dibangun atas guards dan user providers. Guards mendifinisikan bagaimana user user terauthentikasikan untuk setiap request. Sekarang mari kita coba buat methode guard() pada controller kita dimana nantinya akan mengembalikan data custom guard untuk admin. Methode ini juga akan dipanggil pada langkah berikutnya pada methode register()
//RegisterController.php
namespace App\Http\Controllers\AdminAuth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
//Validator facade used in validator method
use Illuminate\Support\Facades\Validator;
//
Admin
Model
use App\
Admin
;
//Auth Facade used in guard
use Auth;
class RegisterController extends Controller
{
//shows registration form to admin
public function showRegistrationForm()
{
return view('
admin
.auth.register');
}
//Handles registration request for
admin
public function register(Request $request)
{
//Validates data
$this->validator($request->all())->validate();
//Create
admin
$seller = $this->create($request->all());
//Authenticates
admin
$this->guard()->login($
admin
);
//Redirects
admin
return redirect($this->redirectPath);
}
//Validates user's Input
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:sellers',
'password' => 'required|min:6|confirmed',
]);
}
//Create a new
admin
instance after a validation.
protected function create(array $data)
{
return Admin::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
//Get the guard to authenticate Admin
protected function guard()
{
return Auth::guard('web_admin');
}
}
Ok, saya faham anda pasti memikirkan apa itu Auth::guard('web_admin'). Methode Auth::guard() digunakan oleh laravel untuk mengauthentikasi yang akan mengembalikan nilai default sesuai dengan guard authentikasi yang dipilih. Karena kita akan mengauthentikasikan admin, maka kita harus menginformasikan kepada laravel untuk mengauthentikasi admin dengan custom guard "web_admin".Sekarang mari kita buat custom guard "web_admin" kita akan memulai dengan menambahkan User Provider baru untuk custom guard kita. User Provider akan memberitahukan kepada laravel tentang model/table yang terkait dengan custom guard tersebut.
Buka file config/auth.php dan tambahkan user provider baru yaitu admins pada providers array
//auth.php
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
//Seller user provider
'admins' => [
'driver' => 'eloquent', //We are using eloquent model
'model' => App\Admin::class,
],
],
Berikutnya kita akan membuat custom guard pada guards array pada file yang sama yaitu config/auth.php. Kita harus merincikan guard driver dan user provider untuk guard kita. kita akan menggunakan session sebagai guard driver dan admin sebagai user provider yang telah kita definisikan sebelumnya.
//auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
//Our new custom driver.
'web_admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
Nah custom guard kita sudah terbentuk dan siap digunakan untuk mengauthentikasi admin. Langkah terakhir pada methode register() pada RegisterController adalah meredirect admin ke halaman admin jika login berhasil.Sekarang kita akan mendeklarasikan properti redirectPath untuk admin pada RegisterController yang akan meredirect admin pada homepagenya sebagai contoh disini adalah "home"
//RegisterController.php
namespace App\Http\Controllers\AdminAuth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
//Validator facade used in validator method
use Illuminate\Support\Facades\Validator;
//Admin Model
use App\
Admin
;
//Auth Facade used in guard
use Auth;
class RegisterController extends Controller
{
protected $redirectPath = 'admin_home';
//shows registration form to seller
public function showRegistrationForm()
{
return view('admin.auth.register');
}
//Handles registration request for seller
public function register(Request $request)
{
//Validates data
$this->validator($request->all())->validate();
//Create admin
$seller = $this->create($request->all());
//Authenticates admin
$this->guard()->login($admin);
//Redirects admin
return redirect($this->redirectPath);
}
//Validates user's Input
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:sellers',
'password' => 'required|min:6|confirmed',
]);
}
//Create a new admin instance after a validation.
protected function create(array $data)
{
return Admin::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
//Get the guard to authenticate Seller
protected function guard()
{
return Auth::guard('web_admin');
}
}
Kita juga harus mendefinisikan redirect property dan juga harus mendefinisikan sebelumnya view untuk route Route::get('/seller_home', function(){ return view('seller.home');});Sekarang kita akan membuat view home.blade.php pada direktory view admin folder.
@extends('admin.layouts')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-success">
<div class="panel-heading">Admin's Dashboard</div>
<div class="panel-body">
Greetings.. Admin
</div>
</div>
</div>
</div>
</div>
@endsection
Sepertinya kita mendekati akhir pembahasan kita, beberapa langkah lagi bagian ini terselesaikan :D
Jika kita menjalankan aplikasi kita pastinya masih akan muncul error dan untuk mengatasi hal ini
kita harus meng-extend class Illuminate\Foundation\Auth\User pada model Admin kita. class ini akan mengimplementasikan Illuminate\Contracts\ Auth\Authenticatable interface dan akan mendeklarasikan methode terkait.
Sekarang kita akan mengextend class Illuminate\Foundation\Auth\User dan melakukan beberapa penambahan pada script berikut
//Admin.php
namespace App;
//Class which implements Illuminate\Contracts\Auth\Authenticatable
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
//Mass assignable attributes
protected $fillable = [
'name', 'email', 'password',
];
//hidden attributes
protected $hidden = [
'password', 'remember_token',
];
}
Akhir dari pembahasanJika mengikuti step by step sesuai dengan tutorial yang dijabarkan maka semuanya akan menghasilkan output tanpa error berikut penampakannya :
Sekarang kita telah selesai dengan proses registrasi dan telah dapat menambahkan admin dan login dengan data yang telah teregistrasi tersebut.
Untuk membiasakan anda menggunakan MultiAuth pada proses registrasi ini, silahkan anda membuat berulang" untuk user yang lain misalnya : sale, purchase, finance dll.
Tapi, pembahasan kita belum selesai lho... kita belum membuat system login logout untuk custom guard user kita. Tenang, kita akan membahasnya pada pembahasan berikutnya
Sampai berjumpa dipembahasan berikutnya semoga bermanfaat dan jika ada kesulitan atau bugs dari pembahasan ini silahkan ditanyakan dikolumn komentar.
Happy Coding :)
No comments:
Post a Comment