تخفیف ویژه

آموزش احراز هویت در لاراول ۷.۱۲

دسته بندی: آموزش
زمان مطالعه: 47 دقیقه
۲۹ خرداد ۱۳۹۹

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

فهرست محتوای این مقاله

ایجاد پروژه

در اولین مرحله از طریق خط فرمان و با دستور composer جدیدترین نسخه لاراول ( که در اینجا 7.12 است) را نصب می‌کنیم.

composer create-project --prefer-dist laravel/laravel AuthSystem

ثبت نام و لاگین در لاراول

لاراول به صورت پایه یک پکیج برای احراز هویت در نظر گرفته است که شامل فرانت اند و ظاهر فرم‌های ورود، ثبت نام و فراموشی رمزعبور است. همچنین در زمانی که پروژه را ایجاد می‌کنید یک مدل User و Controller‌های مربوط به موارد بالا را ایجاد می‌کند. فایل‌های Controller بخش احراز هویت در مسیر app/Http/Controller/Auth موجود می‌باشد.

برای ایجاد فرم‌های ورود، ثبت نام و فراموشی رمزعبور باید پکیج مرتبط را طبق دستور زیر در خط فرمان اجرا و نصب کنید.

composer require laravel/ui

بعد از نصب پکیج مورد نظر برای فعال سازی و ایجاد فایل‌های Blade در لاراول نیاز است دستور زیر را در خط فرمان اجرا کنید.

php artisan ui vue --auth

بعد از اجرای دستور بالا دو پوشه به نام‌های auth و layouts در مسیر resources/views و همچنین یک فایل home.blade.php ساخته می‌شود.

این دستور به غیر از ساخت فرم ها، مسیرهای (Routes) احراز هویت را نیز می‌سازد که به شکل زیر است.

  • http://127.0.0.1:8000/login
  • http://127.0.0.1:8000/register
  • http://127.0.0.1:8000/password/reset
  • http://127.0.0.1:8000/home

این مسیر‌ها توسط کد زیر در فایل routes/web.php ساخته می‌شوند.

Auth::routes();
Route::get('/home', '[email protected]')->name('home');

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

ساخت فرم لاگین در لاراول

در قسمت آخر زمانی که مسیرهای بالا را باز می‌کنید مشاهده می‌کنید که صفحات هیچ استایل و شکل ظاهری ندارند. برای اضافه کردن استایل پیش‌فرض لاراول و بوت استرپ یا باید فایل‌های css و js را در فایل‌های Blade مربوط به این صفحات عوض کنید یا دستور زیر را وارد کنید تا استایل‌ها کامپایل شده و در دو فایل public/js/app.js و public/css/app.css قرار گیرد.

npm install && npm run dev

مدل کاربران

در لاراول به طور پیش‌فرض از مدل User برای کاربران و احراز هویت استفاده می‌شود ولی شما می‌توانید این مدل را عوض کنید که در ادامه به شما توضیح خواهیم داد.

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

فایل Migration جدول کاربران در مسیر database/migartions و با نام 2014_10_12_000000_create_users_table.php وجود دارد. اگر نیاز به اطلاعات بیشتری دارید می‌توانید در این فایل ستون‌هایی اضافه کنید تا اطلاعات کاربر در آن ساخته شود.

دستور زیر را اجرا کنید تا جداول در پایگاه داده ساخته شود.

php artisan migrate

حال می‌توانید از طریق مسیرهای بالا ثبت نام کنید و یا وارد شوید.

تغییر مسیر بعد از ورود

به صورت پیش‌فرض لاراول بعد از ورود شما را به مسیر http://127.0.0.1:8000/home هدایت می‌کند که می‌توانید این آدرس را تغییر دهید.

برای تغییر آدرس به مسیر app/Providers و فایل RouteServiceProvider.php بروید و متغیر HOME را در خط 24 به شکل زیر تغییر دهید.

public const HOME = '/dashboard';

همچنین می‌توانید یک متغیر دیگر تعریف کنید و اسم آن را DASHBOARD بگذارید و بعد در فایل LoginController.php در متغیر redirectTo به RouteServiceProvider::DASHBOARD تغییر دهید. ولی ما فعلا این کار را نمی‌کنیم. (دلیلی هم ندارد :))

در مرحله‌ی بعد باید مسیر مربوط به dashboard/ را بسازید. در فایل routes/web.php کد زیر را اضافه کنید.

Route::get('/dashboard', '[email protected]')->name('dashboard');

بعد برای نمایش فایل Blade پیشخوان در فایل HomeController.php  متد زیر را اضافه کنید.

public function dashboard()
    {
        return view('home');
    }

در صورت نیاز می‌توانید فایل Blade مورد نظر خود را نوشته و در تابع view اسم فایل را بنویسید.

ورود با ایمیل یا نام کاربری

ایده به این صورت است که ما یک فیلد ورودی برای نام کاربری و ایمیل داریم که کاربر می‌تواند هم با ایمیل و هم با نام کاربری ثبت شده در سایت وارد شود.

اضافه کردن فیلد نام کاربری

در مرحله اول باید یک فیلد برای نام کاربری در جدول users ایجاد کنیم. فایل Migration مربوط به جدول کاربران را باز کنید و متد up را به صورت زیر تغییر دهید.

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('username')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

یک فیلد username را اضافه کردیم که نام کاربری کاربر را در آن ذخیره کنیم و یکتا است زیرا نمی‌توانیم چند نام کاربری داشته باشیم.

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

php artisan migrate:refresh

این کار تمامی Migration‌ها را پاک می‌کند و از اول اجرا می‌کند پس توجه داشته باشید اطلاعات نیز حذف خواهند شد.

تغییر فرم ثبت نام

در این مرحله باید فایل Blade مربوط به ثبت نام کاربر را تغییر دهیم تا کاربر موقع ثبت نام بتواند نام کاربری را نیز انتخاب کند.

فایل resources/views/auth/register.blade.php را به صورت زیر تغییر دهید.

@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">{{ __('Register') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('register') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>

                            <div class="col-md-6">
                                <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>

                                @error('name')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

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

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="username" class="col-md-4 col-form-label text-md-right">{{ __('Username') }}</label>

                            <div class="col-md-6">
                                <input id="username" type="username" class="form-control @error('username') is-invalid @enderror" name="username" value="{{ old('username') }}" required autocomplete="username">

                                @error('username')
                                <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="new-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>

                            <div class="col-md-6">
                                <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-6 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Register') }}
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

یک فیلد به نام username اضافه کردیم.

در فرم ورود نیز باید یک فیلد یکسان برای ایمیل و نام کاربری تعریف کنیم. فایل resources/views/auth/login.blade.php را به صورت زیر تغییر دهید.

@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') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('login') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="login" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address Or Username') }}</label>

                            <div class="col-md-6">
                                <input id="login" type="text" class="form-control @error('login') is-invalid @enderror" name="login" value="{{ old('login') }}" required autocomplete="login" autofocus>

                                @error('login')
                                    <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

فیلد email را به login تغییر دادیم و بعد در بخش Controller بررسی می‌کنیم که کاربر ایمیل یا نام کاربری را وارد کرده است.

تغییرات بخش مدل

اگر به بخش ثبت نام مراجعه کنید و یک کاربر ثبت کنید با خطا مواجه می‌شوید که می‌گوید فیلد username در دیتابیس یک مقدار پیش‌فرض ندارد. این بدین معنی است که شما نام کاربری‌ که در فرم ثبت نام وارد می‌کنید در مدل User ثبت نمی‌شود.

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

به فایل app/User.php رفته و متغیر fillable را به شکل زیر تغییر دهید.

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

حال می‌توانید یک کاربر ایجاد کنید. به راحتی 🙂

تغییرات بخش Controller

در مرحله‌ی اول باید بخش ثبت نام را تغییر دهیم تا هم در اعتبارسنجی و هم در بخش اضافه کردن کاربر فیلد username لحاظ شود.

در فایل RegisterController.php دو متد validator و create را به صورت زیر تغییر دهید.

    /**
     * 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', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'username' => ['required', 'string', 'max:255', 'unique:users,username'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param array $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'username' => $data['username'],
            'password' => Hash::make($data['password']),
        ]);
    }

اعتبارسنجی فیلد نام کاربری را به صورت زیر در نظر گرفته‌ایم.

  • حتما باید وارد شود.
  • یک رشته است.
  • بیشترین کاراکتر آن 255 است.
  • باید در جدول users و ستون username یکتا باشد.

حال به راحتی می‌توانید در سایت ثبت نام کنید.

در مرحله‌ی بعد باید در فایل Controller مربوط به ورود یک اعتبارسنجی انجام دهیم که چک شود ایمیل یا نام کاربری است.

فایل LoginController.php را به صورت زیر تغییر دهید.

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;

    /**
     * Login username to be used by the controller.
     *
     * @var string
     */
    protected $username;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
        $this->username = $this->findUsername();
    }

    /**
     * Get the login username to be used by the controller.
     *
     * @return string
     */

    public function findUsername()
    {
        $login = request()->input('login');

        $fieldType = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';

        request()->merge([$fieldType => $login]);

        return $fieldType;
    }

    /**
     * Get username property.
     *
     * @return string
     */
    public function username()
    {
        return $this->username;
    }
}

روش کار به این صورت است که یک متغیر به نام username تعریف می‌کنیم و فیلد ورودی توسط تابع filter_var اعتبارسنجی می‌شود و اگر ایمیل یا نام کاربری بود در متغیر username ذخیره می‌شود و بعد از آن از طریق متد username برگردانده می‌شود و عملیات ورود توسط آن انجام می‌شود.

حال در یک فیلد می‌توانید هم با نام کاربری و هم با ایمیل وارد شوید.

نمایش محتوا به کاربران وارد شده

می‌توانید در فایل‌های Blade پروژه لاراول با دستوراتی که وجود دارد بخشی از View را فقط به کاربرانی که وارد شده‌اند نشان دهید و همچنین بخشی از آن را فقط به کاربران مهمان نشان دهید.

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

@auth
    <p id="newElement">به کاربران مهمان نمایش نده</p>
@else
    <p id="newElement">به کاربران مهمان نمایش بده</p>
@endauth

همچنین از متد [email protected] برای بررسی شرط مهمان بودن می‌توانید استفاده کنید.

@guest
    guest users data
@else
    logged in users data
@endguest

حال اگر نیاز به اطلاعاتی از کاربر وارد شده، داشته باشید از طریق متدهای زیر می‌توانید به آن دسترسی داشته باشید.

{{ Auth::user()->name }} {{-- <- Name of the user --}}
{{ Auth::user()->email }} {{-- <- Email of the user --}}
{{ Auth::user()->id }} {{-- <- id of the user --}}
{{-- Laravel also has shorthand method for id --}}
{{ Auth::id() }} {{-- <- shorthand for id --}}

در صورت استفاده از Auth()->user می‌توانید به تمامی اطلاعات کاربر که در دیتابیس شما ذخیره شده است دسترسی داشته باشید.

مدل سفارشی برای ورود

ممکن است دو بخش برای ورود داشته باشیم. برای مثال یک بخش برای کاربران سایت و یک بخش برای مدیرهای سایت داشته باشیم. در این مورد، نیاز است که بخش احراز هویت مدیرها را خودمان بنویسیم.

ایجاد مدل مدیر

در اولین مرحله باید مدل مدیر را بسازیم. با دستور زیر یک مدل، فایل Migration و Controller مربوط به مدل مدیر را می‌سازیم.

php artisan make:model Admin -mc

حال به فایل Migration مربوط به مدل مدیر در مسیر database/migrations بروید و به شکل زیر آن را تغییر دهید.

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

نام، ایمیل و رمز عبور را برای مدیرها قرار دادیم. (شما طبق نیاز خودتان می‌توانید هر اطلاعاتی که نیاز دارید را در دیتابیس برای مدیر‌ها ذخیره کنید)

با اجرای دستور زیر جدول مدیرها در دیتابیس ساخته می‌شود.

php artisan migrate

در فایل مدل مربوط به Admin که در مسیر app/Http قرار دارد نیز نیاز است فیلدهای مورد نظر برای ثبت یک مدیر را در متغیر fillable قرار دهیم. به صورت زیر فایل Admin.php را تغییر دهید.

namespace App;

use Illuminate\Database\Eloquent\Model;

class Admin extends Model
{
    //
    protected $fillable = [
        'name', 'email', 'password',
    ];
    protected $hidden = ['password'];
}

سه مقدار نام، ایمیل و رمز عبور را در متغیر fillable قرار دادیم. همچنین برای پنهان کردن رمزعبور در مواقعی که ممکن است لیست مدیرها یا یک مدیر را برگردانیم، فیلد رمز عبور را در متغیر hidden قرار دادیم.

تنظیمات مربوط به احراز هویت

ایده‌ای که مطرح کردیم را به اصطلاح Guard می‌گویند. بدین معنی است که ما برای سیستم احراز هویت خود می‌توانیم گاردهای زیادی تعریف کنیم و در هر قسمت از آن‌ها استفاده کنیم.

برای تعریف یک گارد جدید نیاز است در تنظیمات بخش احراز هویت پروژه خود که در مسیر config و فایل auth.php قرار دارد، یک مدل را به عنوان گارد معرفی کنیم.

فایل auth.php را به صورت زیر تغییر دهید.

<?php

return [

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins'
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],

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

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],


    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
    ],

    'password_timeout' => 10800,

];

در قسمت guards یک گارد جدید با عنوان admin تعریف کردیم و دو مقدار driver و provider که نشان دهنده‌ی نوع گارد است که می‌تواند session یا token باشد.

session مربوط به احراز هویت توسط سشن‌ها است که از طریق موتور قالب ساز Blade انجام می‌شود و token مربوط به احراز هویت از طریق api است که در ادامه به آن خواهیم پرداخت.

در قسمت provider نیز مشخص می‌کنیم این گارد از چه فراهم کننده‌ای استفاده می‌کند که در پایین‌تر آن را تعریف می‌کنیم.

در قسمت providers یک فراهم کننده (Provider) جدید برای بخش مدیرها تعریف کردیم که عنوان آن admins است و دو مقدار driver و model دارد.

در مقدار driver می‌تواند eloquent یا database قرار بگیرد. ما در اینجا برای اینکه می‌خواهیم احراز هویت را از طریق مدل مدیر انجام دهیم پس مقدار eloquent را وارد می‌کنیم.

در قسمت model نیز مدل مربوط به این فراهم کننده را وارد می‌کنیم. توجه کنید مدل باید با namespace مرتبط و طبق کد بالا باشد.

حالا ما یک گارد جدید تعریف کردیم و از این پس می‌توانیم در قسمت‌هایی مثل ورود و اعتبارسنجی اینکه کاربر وارد شده است یا نه، از آن استفاده کنیم.

فرم ورود مدیر

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

در مسیر resource/views یک پوشه به نام admin می‌سازیم و فایل‌های ورود و داشبورد را در آن قرار می‌دهیم.

فایل login.blade.php در مسیر admin را به صورت زیر طراحی کنید.

@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">{{ __('Admin Login') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('admin.login') }}">
                        @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>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

فایل admin.blade.php را در کنار فایل ورود بسازید و به شکل زیر طراحی کنید.

@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">Admin Dashboard</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    You are a cool ADMIN !
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

حال دو صفحه ورود و پیشخوان مدیر ما آماده است.

ایجاد مسیرهای ورود و پیشخوان

برای مدیر‌ها ثبت نام نداریم زیرا کسی نمی‌تواند از طریق سایت به عنوان مدیر عضو شود و باید مدل اولین مدیر خود را خودمان بسازیم که در ادامه توضیح خواهم داد.

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

Route::get('/admin/login', '[email protected]')->name('admin.view_login');
Route::post('/admin/login', '[email protected]')->name('admin.login');
Route::get('/admin', '[email protected]')->name('admin.dashboard')->middleware('auth:admin');

مسیرهای اول و دوم به ترتیب برای نمایش صفحه فرم ورود و فرستادن اطلاعات ورود، به کار برده می‌شوند.

مسیر سوم مربوط به نمایش صفحه پیشخوان مدیر است. در مسیر سوم یک middleware قرار دادیم که در آن گفتیم برای دسترسی به آن کاربر باید وارد شود و احراز هویت مربوط به گارد admin باشد.

ایجاد بخش Controller

برای کنترل بخش ورود، احراز هویت و نمایش پیشخوان مدیرها باید یک Controller بسازیم که ما در زمان ساخت مدل مدیر آن را ساختیم. فایل AdminController.php را به صورت زیر تغییر دهید. در ادامه توضیح می‌دهم.

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/admin';
    protected function guard()
    {
        return Auth::guard('admin');
    }

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

    public function username() :string
    {
        return 'email';
    }

    public function index(){
        return view('admin.admin');
    }
}

در اولین مرحله در خط 11 از یک Trait مربوط به احراز هویت پیش‌فرض لاراول استفاده کردیم که برای ما توابع پیشفرض را می‌سازد.

ولی ما توابع مرتبط به بحث خودمان را سفارشی سازی کردیم.

از یک متغیر به نام redirectTo استفاده کردیم تا بعد از ورود به این آدرس منتقل شویم. این کار توسط خود لاراول و فقط با قرار دادن همین متغیر انجام می‌شود.

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

در متد showLoginForm فایل View مربوط به ورود مدیرها که در بالاتر آن را ساختیم، نمایش می‌دهیم.

همچنین در متد username فیلد مورد نظر برای فیلد به عنوان نام کاربری که در اینجا همان ایمیل است را برمی‌گردانیم.

متد index نیز برای نمایش فایل View پیشخوان مدیر استفاده می‌شود.

توجه کنید ما متدی به عنوان login را تعریف نکردیم چون که نیاز نیست و به صورت پیش‌فرض لاراول این کار را طبق تنظیماتی که در بالا اعمال کردیم برای ما انجام می‌دهد.

ساخت اولین مدیر

از آن جایی که مدیرها را نمی‌توان از طریق صفحه ثبت نام ساخت نیاز است ما دستی این کار را انجام دهیم.

برای انجام دستورها و کدهای لاراول یک محصول به اسم Tinker وجود دارد که با دستور زیر یک خط فرمان در اختیار شما قرار می‌دهد تا شما کدهای لاراول خود را در لحظه اجرا کنید.

php artisan tinker

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

کدهای زیر را طبق ترتیب وارد کنید تا یک مدل از مدیر بسازیم و آن را در دیتابیس ذخیره کنیم.

$admin = \App\Admin::create(['name'=>'Vahid','email'=>'[email protected]','password'=>\Illuminate\Support\Facades\Hash::make(123456)]);

یک مدیر با نام Vahid و ایمیل [email protected] و همچنین رمزعبور 123456 را ساختیم و حالا اگر دیتابیس خود را چک کنید می‌بینید یک مدیر در جدول وجود دارد.

حالا می‌توانید از طریق آدرس http://127.0.0.1:8000/admin/login به پیشخوان مدیریت وارد شوید.

جمع بندی:

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

اگر به یادگیری بیشتر لاراول علاقه داری می‌توانی در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه‌ها به صورت کامل برنامه‌ نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.

چه امتیازی به این مقاله می دید؟
نویسنده وحید حسنی
از دوست داران دنیای تکنولوژی مخصوصا دنیای وب از توسعه دهندگان وب مخصوصا بک اند از عاشقان پی اچ پی مخصوصا لاراول از دیوانگان کار کردن مخصوصا در آی ویرا ;-)

نظرات کاربران

zahra

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

نازنین کریمی مقدم

سلام.
اگر مراحل رو درست انجام بدید نباید به خطا بخورید. ارورتون چی هست؟

mahdi

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

پرویز

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

وحید حسنی

سلام ممنون از نظر خوبتون
حتما در اولین فرصت…آموزش بعدی برای همین بحث هستش

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :