28 فروردین 1398 ساعت 22:14

آموزش ایجاد احراز هویت چندگانه (multi authentication) در لاراول

بصورت پیش فرض احراز هویت در لاراول بر اساس جدول users صورت می گیرد. البته شما می توانید نام این جدول و مدل مربوط به آن را مطابق پروژه ی خود نیز تغییر دهید. 

بصورت پیش فرض احراز هویت در لاراول بر اساس جدول users صورت می گیرد. البته شما می توانید نام این جدول و مدل مربوط به آن را مطابق پروژه ی خود نیز تغییر دهید. 

با این حال در برخی مواقع اتفاق می افتد که شما نیاز به استفاده از دو یا چند جدول برای داشتن کاربران متفاوت می باشد که بدون شک هر کدام از این کاربران و انواع آنها نیاز به احراز هویت خاص خود را دارند که در لاراول این کار نیز به راحتی قابل انجام می باشد. 

در این مطلب ما برای نمونه جدولی برای معلمان ایجاد خواهیم کرد که معلمان در این جدول ذخیره و در صفحه لاگین مربوط به خود وارد سیستم خواهند شد

ابتدا جدول teachers را ایجاد می کنم، دستور زیر را در ترمینال اجرا نمایید:

php artisan make:migration create_teacher_table  --create='teachers'

حال تابع up مربوط به migration ایجاد شده در خط بالا یعنی مایگریشن teachers را بصورت زیر تغییر دهید:

public function up()
    {
        Schema::create('teachers', function (Blueprint $table) {
            $table->increments('id');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();            
            $table->timestamps();
        });
    }

حال خط زیر را در خط فرمان ترمینال خود اجرا نمایید:

php artisan migrate

حال یک مدل بنام Teacher ایجاد نمایید، البته این مدل به دلیل اینکه کار احراز هویت معلمان را بر عهده دارد با مدل های معمولی کمی تفاوت خواهد داشت. پس مدل Teacher خود را مطابق کدهای زیر تغییر دهید:

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Teacher extends Authenticatable
{
    use Notifiable;

    protected $table = 'teachers';

    protected $fillable = ['email',  'password'];

    protected $hidden = ['password',  'remember_token'];


}

دقت کند که مدل Teacher باید از کلاس Authenticatable  ارث بری کند و همچنین trait Notifiable  باید در این مدل use شده باشد.

 

حال باید گارد مربوط به مدل Teacher را ایجاد نماییم. 

فایل config/auth.php را باز کنید. همانطور که مشاهده می کنید مدل User بصورت پیش فرض از گارد Web استفاده کرده است.

حال ما یک گارد بنام teacher برای احراز هویت مربوط به معلمان ایجاد خواهیم کرد. 

پس محتوای فایل auth.php بصورت زیر تغییر خواهد کرد:

 'guards' => [

        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'teacher'  => [
          'driver'  => 'session',
          'provider' => 'teachers',
        ],

    ],


 'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

        'teachers' => [
            'driver' => 'eloquent',
            'model'  => App\Teacher::class,
        ],
]

همانطور که مشاهده میکنید ما یک گارد بنام teacher ایجاد کرده ایم که از درایور session و سرویس دهنده آن teachers نام دارد. 

در آرایه مربوط به سرویس دهند ها یا providers نیز مدل مربوطه به سرویس مورد نظر و درایو آن که eloquent می باشد را برای مدل مورد نظر که همان Teacher می باشد معرفی کرده ایم.

حالا روت های مربوط به معلمان را در فایل web.php تعریف بصورت زیر تعریف می کنیم:

Route::get('/teacher/login', 'Auth\TeacherLoginController@showLoginForm')->name('teacher.login');
Route::post('/teacher/login', 'Auth\TeacherLoginController@login')->name('teacher.login.post');
Route::post('/teacher/logout', 'Auth\TeacherLoginController@logout')->name('teacher.logout');

/_*
 _  teacher profile routes
 */
Route::group(['middleware'=>'teacher'], function() {
    Route::get('/teacher/home', 'Teacher\HomeController@index');
});

 

یک روت get برای نمایش صفحه لاگین، یک روت post برای دریافت اطلاعات لاگین، یک روت بنام lougout برای خروج و یک روت هم برای صفحه home معلمان تعریف کرده ایم.

روت home از یک middleware استفاده می کنه که این middleware میاد و بررسی می کنه که آیا کاربر لاگین کرده جزء معلمان هست یا نه.

خوب حالا باید middleware مربوط به teacher رو ایجاد کنیم

یک middleware بنام RedirectIfNotTeacher ایجاد و آنرا مطابق زیر تغییر دهید:

<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfNotTeacher
{
    /_*
     _ Handle an incoming request.
     _
     _ @param  \Illuminate\Http\Request  $request
     _ @param  \Closure  $next
     _ @return mixed
     */
    public function handle($request, Closure $next, $guard="teacher")
    {
        if(!auth()->guard($guard)->check()) {
            return redirect(route('teacher.login'));
        }
        return $next($request);
    }
}

این middleware با استفاده از گارد teacher کار احراز هویت را انجام خواهد داد و در صورتی که کاربر به درستی لاگین کرده باشد اجازه دسترسی را خواهد در و درصورتی که لاگین نکرده باشد آن را به روت login هدایت خواهد کرد.

حال کلاس middleware را در فایل  kernel.php اضاف کنید:

  protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        // your custom middleware class 
        'teacher' => \App\Http\Middleware\RedirectIfNotTeacher::class,
    ];

 

با دقت در کدهای بالا متوجه خواهید شد که با middleware مربوط به teacher را در آرایه $routeMiddleware قرار داده ایم. 

حال  فایل لاگین مربوط به معلمان را ایجاد کنید. برای نمونه فرم لاگین می تواند بصورت زیر باشد. دقت کنید که اکشن مربوط به فرم را بر روی روت لاگین teacher که در مرحله ایجاد روت ساخته بودیم قرار دهید.

<form class="form-horizontal" method="POST" action="{{ route('teacher.login.post') }}">
    {{ csrf_field() }}

    <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 autofocus>

            @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">
        <div class="col-md-6 col-md-offset-4">
            <div class="checkbox">
                <label>
                    <input type="checkbox" name="remember" {{ old('remember') ? 'checked' : '' }}> Remember Me
                </label>
            </div>
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-8 col-md-offset-4">
            <button type="submit" class="btn btn-primary">
                Login
            </button>

        </div>
    </div>
</form>

 

حال کنترل TeacherLoginController که مربوط به لاگین teacher می باشد را بصورت زیر ایجاد نمایید:

 

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

class TeacherLoginController extends Controller
{

    use AuthenticatesUsers;

    protected $redirectTo = '/teacher/home';

    /**
     **_ Create a new controller instance.
     _**
     **_ @return void
     _**/
    public function __construct()
    {
      $this->middleware('guest')->except('logout');
    }
    /**
     _
     _ @return property guard use for login
     _
     _/
    public function guard()
    {
     return Auth::guard('teacher');
    }

    // login from for teacher
    public function showLoginForm()
    {
        return view('auth.teacher-login');
    }

 }

در سازند یا construct این کنترلر ما گارد خود یعنی گار teacher را به عنوان گارد پیش معرفی کرده ایم. همچنین می توانیم با override کردن متد guard نیز این کار را انجام و گارد مورد نظر خود را معرفی کنیم.

 

امیدوارم از این آموزش استفاده کرده باشید.

درصورتی که سوال یا پیشنهادی دارید می تونید از بخش نظرات ارسال نمایید.

 

972 admin
نظرات

برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *

ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *

پاسخ به نظر
اگر نظری برای این مطلب ارسال شد از طریق ایمیل مرا اطلاع بده!

حسن
واقعا عالی بود خیلی ممنون همچین، موضوعی به زبان فارسی تنها سایت شما بود که به این خوبی بهش پرداخته بودید خیلییی ممنون فقط چیزی که اصلا ندیدم بهش بپردازند ریست پسورد چند گانه هست ولی با شماره تلفن که خوب کلاس های آماده sms.ir برای ارسال sms هست ولی چطور نخواهیم دستی کد بنویسیم و با اوراید کردن تریت های خود لاراول (مثل این آموزش) این کار انجام بدیم حتما آموزششو بزارید جزئی از آموزش های تاپ تاپ

پاسخ به این نظر

پاسخ
ایمان برومند زاده
چشم انشاالله :) باز هم به ما سر بزنید:*

پاسخ به این نظر

پاسخ
حسن
ولی حتما اموزششو بزارید چه با تلفن چه با ایمیل خوب بحث توکن سفارشی یا ... جایی گفته نشده

پاسخ به این نظر

پاسخ
ایمان برومند زاده
سلام دوست عزیز. خوشحالیم که آموزش ما مورد توجه شما قرار گرفت. خوب برای رسیت پسوورد برا هر بخش هم شما می تونید از همون ریست پسوورد پیش فرض لاراول استفاده کنید. و شاید ساده ترین راه افزودن یه فلگ هست که کار مشخص کنه از کدوم provider هست.

پاسخ به این نظر

0