LightBlog

Saturday, December 2, 2017

Laravel 5.5 Multi Auth, Bagian I : Registrasi

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.
php artisan make:auth
Berikutnya kita akan membuat model baru dan melakukan migrasi pada user admin tersebut
php artisan make:model Admin -m
Buka file admin migration dan tambahkan keterangan kolom berikut :
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 table
php artisan migrate
Setelah selesai mari menambahkan beberapa route untuk registrasi, buka routes/web.php dan tambahkan script berikut ini.
//web.php
Route::get('admin_register', 'AdminAuth\RegisterController@showRegistrationForm');
Route::post('admin_register', 'AdminAuth\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
php artisan make:controller SellerAuth/RegisterController
Setelah terbentuk, kita akan melakukan beberapa perubahan / penambahan pada script tersebut
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">
                        &nbsp;
                    </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;

//AdminModel
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 pembahasan
Jika 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

Adbox