Multiple authentication in Laravel 5.4

Multiple authentication in Laravel 5.4

Chào mọi người, nhân tiện sự kiện Laravel release bản 5.5 mình xin được làm tutorial hướng dẫn về authentication trong Laravel 5.4 :D
Và sẽ hứa hẹn update phần này trong thời gian không xa tới.
Đi vào vấn đề chính

Tạo migration, model và seed dữ liệu cho admin

php artisan make:model Models/Admin
php artisan make:migration create_admins_table --create=admins
php artisan make:seeder AdminsTableSeeder

Migration cho admin

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAdminsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->rememberToken();
            $table->boolean('status')->default(true);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('admins');
    }
}

Model Admin

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable
{
    protected $table = 'admins';
}

Seed dữ liệu admin

<?php

use Illuminate\Database\Seeder;
use App\Models\Admin;

class AdminsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Admin::create([
            'name' => 'Admin',
            'email' => 'admin@haposoft.com',
            'password' => Hash::make('haposoft'),
        ]);
    }
}

Xong xuôi nhớ chạy db seed nhé bạn.
Tiếp tục chương trình bạn tạo các middleware cho phần login của admin

php artisan make:controller AdminAuth/AuthController
php artisan make:middleware Admin/Authenticate
php artisan make:middleware Admin/RedirectIfAuthenticated
php artisan make:controller Admin/DashboardController

Bạn edit lại AdminAuth/AuthController

<?php

namespace App\Http\Controllers\AdminAuth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/admin/dashboard/';
    
    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('admin_guest', ['except' => 'logout']);
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:190',
            'email' => 'required|email|max:190|unique:admins',
            'password' => 'required|confirmed|min:8',
        ]);
    }

    public function showLoginForm()
    {
        return view('auth_admin.login');
    }

    protected function guard()
    {
      return Auth::guard('admin');
    }

}

Authenticate

<?php

namespace App\Http\Middleware\Admin;

use Closure;

class Authenticate
{
    /**
     * 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)->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('admin/login');
            }
        }

        return $next($request);
    }
}

RedirectIfAuthenticated

<?php

namespace App\Http\Middleware\Admin;

use Closure;

class RedirectIfAuthenticated
{
    /**
     * 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('/admin/dashboard/');
        }

        return $next($request);
    }
}

DashboardController

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class DashboardController extends Controller
{
    public function index()
    {
        return view('admin.index');
    }
}

Thêm guards cho admin trong fie config/auth.php

//For Admin Module
 'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],

add thêm providers

'admins' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admin::class,
        ],

passwords

'admins' => [
            'provider' => 'admins',
            'email' => 'auth.emails.password',
            'table' => 'password_resets',
            'expire' => 60,
        ], 

Tạo file view cho login admin
auth_admin/login.blade.php

    <div class="login-box-body">
        <p class="login-box-msg">Sign in to start your session</p>

        <form role="form" method="POST" action="{{ route('admin.login') }}">
          {{ csrf_field() }}
          <div class="form-group has-feedback">
            <input id="email" type="email" name="email" class="form-control" placeholder="Email" value="{{ old('email') }}" required autofocus>
            <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
        </div>
        @if ($errors->has('email'))
        <span class="help-block">
            <strong>{{ $errors->first('email') }}</strong>
        </span>
        @endif
        <div class="form-group has-feedback">
            <input type="password" id="password" type="password" class="form-control" name="password" placeholder="Password" required autofocus>
            <span class="glyphicon glyphicon-lock form-control-feedback"></span>
        </div>
        @if ($errors->has('password'))
        <span class="help-block">
            <strong>{{ $errors->first('password') }}</strong>
        </span>
        @endif
        <div class="row">
            <div class="col-xs-12">
              <button type="submit" class="btn btn-primary btn-block btn-flat">Sign In</button>
          </div>
      </div>
  </form>
</div>

route

Route::group(['namespace' => 'AdminAuth', 'prefix' => 'admin'], function () {
    Route::get('login', 'AuthController@showLoginForm');
    Route::post('login', ['as' => 'admin.login','uses' => 'AuthController@login']);
    Route::get('logout', ['as' => 'admin.logout','uses' => 'AuthController@logout']);
});

Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'as' => 'admin.','middleware' => 'admin_auth'] ,function() {
    Route::get('dashboard',     ['as' => 'dashboard',       'uses' => 'DashboardController@index']);
});

Và nhớ add thêm phần định nghĩa các Middleware vào Kernel.php nhé

'admin_auth' => \App\Http\Middleware\Admin\Authenticate::class,
'admin_guest' => \App\Http\Middleware\Admin\RedirectIfAuthenticated::class,


Do thời gian có hạn tôi sẽ liên tục cập nhật tutorial này và giải thích chi tiết thêm những định nghĩa và thắc mắc tại đây ^^