سلام! من آرش فدایی هستم و تو این قسمت از سری آموزشی لاراول ۱۲ قراره درباره احراز هویت یا همون Authentication صحبت کنیم. احراز هویت یکی از مهمترین بخشهای هر اپلیکیشن وب هست که به کاربرا اجازه میده ثبتنام کنن، لاگین کنن و به بخشهای محافظتشده دسترسی داشته باشن. لاراول با ابزارهای آمادهای مثل Laravel Authentication این کار رو خیلی راحت کرده. تو این مقاله، یاد میگیرید چطور سیستم ثبتنام و لاگین رو پیاده کنید و یه کم هم شخصیسازیش کنید. بریم شروع کنیم!
احراز هویت: تجربه شخصی من
اولین باری که خواستم سیستم لاگین برای یه پروژه بسازم، فکر میکردم باید کلی کد بنویسم. اما وقتی با ابزارهای آماده لاراول آشنا شدم، شگفتزده شدم که چطور تو چند دقیقه میتونم یه سیستم کامل لاگین و ثبتنام راه بندازم. تو یکی از پروژههام، داشتم یه پلتفرم مدیریت کاربر میساختم و با Laravel Authentication تونستم سریع یه سیستم امن و کاربردی درست کنم. تو لاراول ۱۲، این ابزارها حتی بهتر شدن و قابلیتهای جدید مثل بهبودهای امنیتی بهشون اضافه شده. حالا بیاید دست به کار بشیم!
پیشنیازها
قبل از شروع، مطمئن بشید که:
-
پروژه لاراولتون درست تنظیم شده (مثل قسمت اول).
-
دیتابیستون تو فایل .env تنظیم شده.
-
Migrationها رو اجرا کردید (php artisan migrate).
ما تو این آموزش از مدل User که به صورت پیشفرض تو لاراول هست استفاده میکنیم.
نصب Laravel Authentication
لاراول یه پکیج آماده برای احراز هویت داره که میتونید با Laravel Breeze یا Laravel Jetstream نصب کنید. ما تو این آموزش از Breeze استفاده میکنیم چون سادهتره و برای شروع عالیه. اول این دستور رو اجرا کنید:
composer require laravel/breeze --dev
php artisan breeze:install
این دستور یه سری فایل برای احراز هویت (مثل کنترلرها، ویوها و مسیرها) رو به پروژه اضافه میکنه. بعد، این دستورها رو بزنید:
npm install
npm run dev
php artisan migrate
اینجا:
-
npm install و npm run dev فایلهای فرانتاند (مثل CSS و JS) رو آماده میکنن.
-
php artisan migrate جدولهای مورد نیاز (مثل users) رو تو دیتابیس میسازه.
یه تجربه از خودم: یه بار فراموش کردم npm run dev رو اجرا کنم و صفحه لاگین بدون استایل لود شد. همیشه مطمئن شید که فایلهای فرانتاند درست کامپایل شدن!
بررسی فایلهای Breeze
بعد از نصب Breeze، این فایلها به پروژه اضافه میشن:
-
مسیرهای احراز هویت تو routes/auth.php
-
کنترلرهای لاگین و ثبتنام تو app/Http/Controllers/Auth
-
ویوهای Blade تو resources/views/auth
برای تست، سرور رو اجرا کنید:
php artisan serve
حالا اگه به http://localhost:8000/login یا http://localhost:8000/register برید، صفحههای لاگین و ثبتنام رو میبینید. من خودم اولین بار که اینو دیدم، باورم نمیشد که با چند خط دستور اینقدر سریع یه سیستم کامل راه افتاده!
شخصیسازی فرم ثبتنام
بیاید فرم ثبتنام رو یه کم شخصیسازی کنیم. فرض کنید میخوایم یه فیلد نام کامل به فرم اضافه کنیم. اول، Migration جدول users رو اصلاح میکنیم. فایل Migration مربوط به جدول users (مثل database/migrations/xxxx_create_users_table.php) رو باز کنید و یه ستون full_name اضافه کنید:
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('full_name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
بعد، دیتابیس رو ریست کنید:
php artisan migrate:fresh
حالا مدل User رو تو app/Models/User.php اصلاح کنید تا full_name به fillable اضافه بشه:
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
protected $fillable = [
'full_name',
'email',
'password',
];
}
حالا فایل ویوی ثبتنام (resources/views/auth/register.blade.php) رو باز کنید و یه فیلد برای full_name اضافه کنید:
<div>
<label for="full_name">نام کامل</label>
<input id="full_name" name="full_name" type="text" required autofocus />
@error('full_name')
<span style="color: red;">{{ $message }}</span>
@enderror
</div>
در نهایت، کنترلر ثبتنام (app/Http/Controllers/Auth/RegisteredUserController.php) رو اصلاح کنید تا full_name رو ذخیره کنه:
protected function create(array $data)
{
return User::create([
'full_name' => $data['full_name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
و اعتبارسنجی رو تو متد store بهروزرسانی کنید:
$request->validate([
'full_name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|confirmed|min:8',
]);
حالا فرم ثبتنام یه فیلد نام کامل داره و دادهها درست ذخیره میشن. من تو یه پروژه داشتم سیستم ثبتنام برای یه پلتفرم آموزشی میساختم و اضافه کردن فیلدهای سفارشی مثل این خیلی به کارم اومد.
محافظت از مسیرها با Middleware
برای اینکه فقط کاربرای لاگینشده به یه سری مسیر دسترسی داشته باشن، از middleware auth استفاده میکنیم. مثلاً فرض کنید میخوایم فقط کاربرای لاگینشده بتونن پستها رو ببینن. تو فایل routes/web.php:
use App\Http\Controllers\PostController;
Route::resource('posts', PostController::class)->middleware('auth');
حالا اگه کاربر لاگین نکرده باشه و بخواد به /posts بره، به صفحه لاگین هدایت میشه. یه تجربه از خودم: یه بار فراموش کردم middleware رو روی مسیرهای حساس بذارم و کاربرای غیرمجاز به بخشهای ادمین دسترسی پیدا کردن. همیشه مسیرهای مهم رو با auth محافظت کنید!
نمایش اطلاعات کاربر
بیاید یه ویو بسازیم که اطلاعات کاربر لاگینشده رو نشون بده. فایل resources/views/profile.blade.php رو بسازید:
@extends('layouts.app')
@section('title', 'پروفایل کاربر')
@section('content')
<h1>پروفایل کاربر</h1>
<p>نام کامل: {{ auth()->user()->full_name }}</p>
<p>ایمیل: {{ auth()->user()->email }}</p>
<a href="{{ route('logout') }}">خروج</a>
@endsection
و تو routes/web.php یه مسیر برای پروفایل اضافه کنید:
Route::get('/profile', function () {
return view('profile');
})->middleware('auth')->name('profile');
اینجا auth()->user() اطلاعات کاربر لاگینشده رو برمیگردونه. من تو یه پروژه داشتم یه داشبورد کاربری میساختم و از این روش برای نمایش اطلاعات پروفایل استفاده کردم.
نکات تکمیلی
-
تأیید ایمیل: Breeze به صورت پیشفرض قابلیت تأیید ایمیل رو داره. برای فعالسازی، مطمئن شید که تنظیمات ایمیل تو .env درست باشه. من یه بار تنظیمات SMTP رو اشتباه وارد کردم و ایمیلها ارسال نشدن!
-
شخصیسازی بیشتر: میتونید استایلهای Breeze رو با Tailwind CSS تغییر بدید یا از Jetstream برای قابلیتهای پیشرفتهتر استفاده کنید.
-
لاراول ۱۲ و بهبودها: تو نسخه ۱۲، احراز هویت امنتر شده و ابزارهای جدید برای مدیریت جلسه (Session) اضافه شده. تو قسمتهای بعدی درباره مدیریت نقشها و مجوزها صحبت میکنیم.
قسمت بعدی قراره درباره روابط (Relationships) تو Eloquent صحبت کنیم که چطور میتونید مدلها رو به هم وصل کنید. اگه سوالی دارید یا جایی گیر کردید، تو کامنتها بپرسید. من همیشه از بازخوردهای شما کلی چیز جدید یاد میگیرم!
تا قسمت بعدی، موفق باشید!
