احراز هویت با مدل Project در لاراول
خلاصهٔ کاملتر
اکثر توسعهدهندههای لاراول وقتی به احراز هویت فکر میکنن، ذهنشون مستقیم میره سراغ App\Models\User. اما لاراول هیچوقت این مدل رو بهعنوان یه کلاس خاص تعریف نکرده؛ User فقط همون چیزیه که لاراول بهصورت پیشفرض scaffold میکنه. احراز هویت در لاراول صرفاً یه قرارداد (contract) هست — هر Eloquent model ای که Authenticatable رو پیادهسازی کنه میتونه وارد بشه، توکن صادر کنه، و از طریق auth()->user() برگشت داده بشه.
این موضوع وقتی اهمیت پیدا میکنه که بخوای یه API بسازی که کلاینتش یه انسان نیست، بلکه یه موجودیت دیگهست؛ مثلاً یه Project. در پروداکتی مثل SimpleStats، یه پروژه توکن داره و رویدادها رو به API گزارش میده — نه یه کاربر خاص. اگه بخوای این حالت رو با رویکرد User-محور مدل کنی، مجبوری project_id رو در همهجا دستبهدست بچرخونی؛ کار پیچیدهای که جای خطا داره.
برای اینکه مدل Project قابلیت احراز هویت پیدا کنه، کافیه Authenticatable trait و HasApiTokens از Sanctum رو بهش اضافه کنی:
class Project extends Model implements AuthenticatableContract
{
use Authenticatable;
use HasApiTokens;
// ...the rest of your project logic
}همین تغییر کافیه. Authenticatable trait تمام متدهایی که سیستم auth لاراول صدا میزنه رو پوشش میده، و HasApiTokens یه رابطه tokens() و متد createToken() بهش اضافه میکنه. جدول personal_access_tokens سنکتوم هم polymorphic هست، یعنی به همون شکل میتونه توکنهای User، Project یا Organization رو کنار هم نگه داره.
مهمترین مزیت اینجا مشخص میشه: داخل controller، $request->user() دیگه یه User برنمیگردونه — بلکه همون Project صاحب توکنه. به این ترتیب:
public function store(StatsVisitorRequest $request): JsonResponse
{
$project = $request->user(); // Project, not User
TrackStatsVisitor::dispatch($project, $request->validated());
return response()->json(['message' => 'Accepted.']);
}این یعنی نه نیاز به پارامتر project_id در URL، نه middleware سفارشی برای «پروژه فعلی»، نه policy اضافه برای چک کردن دسترسی کاربر به پروژه. موجودیت احراز هویتشده خودش Project هست، پس مشکل authorization خودبهخود حل میشه. تمام لایههای اپ (controller، job، policy، broadcast) از auth()->user() یه Project با تایپ درست میگیرن.
این الگو به چند دلیل ارزش دونستن داره: توکنها به موجودیتی تعلق میگیرن که واقعاً «عمل میکنه»، نه لزوماً انسانی که اون رو ساخته؛ میشه در یه اپ چند مدل مختلف (User، Project، Organization) رو همزمان authenticatable کرد؛ و authorization تمیز میمونه چون policy مستقیماً با subject واقعی کار میکنه.
نکات کلیدی:
- هر Eloquent model ای که Authenticatable رو پیادهسازی کنه میتونه در لاراول احراز هویت بشه
- اضافه کردن HasApiTokens از Sanctum برای صدور توکن کافیه
- $request->user() هر موجودیتی رو که توکن بهش تعلق داشته باشه برمیگردونه
- جدول personal_access_tokens سنکتوم polymorphic هست و چند مدل رو همزمان ساپورت میکنه
- این رویکرد نیاز به middleware اضافه، پارامترهای route، و authorization shim رو حذف میکنه




