سایت های متعددی دیدم که در یک زیردامنه کاربر احراز هویت می شود و در همه زیر دامنه دیگر کاربر به عنوان کاربر احراز هویت شده شناسایی می شود. شاید برای بعضی کاربران یا برنامه نویسان سوال پیش میاد، چطور این قابلیت پیاده سازی میشه؟ برای پیاده سازی این قابلیت راه های زیادی وجود دارد و ما در این مقاله بعضی از آنها رو توضیح میدیم. پس با ما همراه باشید.
پیاده سازی این قابلیت به دو روش مختلف است و هر روش بر اساس ساختار برنامه شماست. اگر برنامه شما روی یک codebase
لاراول است و چندین زیر دامنه به آن وصل شده است، روش اول رو گزینش کنید اما اگر ساختار برنامه شما به این صورت است که هر برنامه روی یک زیردامنه در دسترس است، روش دوم را گزینش کنید.
فایل .env
موجود در روت برنامه لاراولی تان را باز کرده و سپس کدهای زیر را اضافه کنید و اگر موجود هستند انها را جایگزین کنید.
SESSION_COOKIE=daniel_session
SESSION_DOMAIN=.daniel.local
در SESSION_COOKIE
اسم کلید کوکی که در آن کلید سشن ذخیره می شود را وارد کنید برای مثال ما daniel_session
را وارد کرده ایم. و در SESSION_DOMAIN
آدرس دامنه خود را وارد کنید برای مثال ما دامنه daniel.local
را وارد کرده ایم. اما نکته که حاظ اهمیت است اینه که قبل از دامنه ما نقطه (.) وارد کرده ایم. شاید برای شما سوال پیش بیاد چرا نقطه قبل از دامنه گذاشتیم. جواب این سوال اینکه که نقطه قبل از دامنه در سشن ها و کوکی به معنی اینکه این کوکی در همه زیردامنه ها در دسترس باشد.
اما با انجام چند تغییر ساده تونستیم session Multi-subdomain
رو پیاده سازی کنیم.
اولا باید مراحل روش اول رو طی کنید و سپس ادامه بدید.
لاراول بصورت پیش فرض سشن ها را بصورت فایل در مسیر storage/framework/sessions
ذخیره می کند، اما فقط برنامه ای که در آن سشن ذخیره شده است می تواند به آن فایل ها دسترسی داشته باشد. ما برای اینکه بتونیم به سشن ها در برنامه های دیگر دسترسی داشته باشیم چندین راه داریم، ما آنها در زیر ذکر می کنیم.
دیتابیس
لاراول این قابلیت را به ما داده است که بتونیم سشن ها را در دیتابیس ذخیره کنیم. برای اینکه بتونیم سشن ها را در دیتابیس ذخیره کنیم باید مراحل زیر را انجام بدیم.
اول باید فایل .env
را ویرایش کنید و کد زیر را اضافه کنید:
SESSION_DRIVER=database
بعد از قرار دادن کد بالا دستور زیرا را اجرا کنید:
php artisan session:table
php artisan migrate
دستور اول جدول سشن را ایجاد می کند و دستور دوم مایگرایشن لاراول را اجرا می کند.
ردیس
شاید شما با دیتابیس محبوب ردیس کار کرده باشید و متوجه بعضی از ویژگی های این دیتابیس باشید، بعضی برنامه نویسان لاراولی فکر می کنند ردیس فقط برای کش هست اما اینو اضافه کنم که ردیس فقط برای کش در لاراول نیست بلکه کاربرد های متفاوتی دارد. و ما در این مقاله از آن برای ذخیره سشن استفاده می کنیم. خب برای اینکه بتونید سشن را در ردیس ذخیره کنید مراحل زیر را دنبال کنید.
اول باید فایل .env
را ویرایش کنید و کدهای زیرا را اضافه کنید:
SESSION_DRIVER = redis
CACHE_PREFIX = daniel_cache
من در SESSION_DRIVER
گفتم که درایور سشن ردیس باشد. لاراول برای ذخیره اطلاعات کش و سشن در ردیس یک prefix
تنظیم می کند و آن را قبل از نام کلید دیتا در ردیس استفاده می کند مثلا daniel_blog_session-xxxxx
، لاراول برای هر برنامه بر اساس پارامتر های این prefix
را تنظیم می کند و ما برای پیشگیری از وقع خطا CACHE_PREFIX
را تنظیم می کنیم و آن را از حالت پیش فرض لاراول خارج می کنیم. مثلا ما برای CACHE_PREFIX
مقدار daniel_cache
تنظیم کرده ایم، شما می توانید هر مقداری را برای آن در نظر بگیرید.
سپس اقدام به اضافه کردن اطلاعات دیتابیس ردیس خود در فایل .env
کنید.
و تمام تا اینجا تونستید ردیس را به عنوان درایور سشن تنظیم کنید.
نکته
یک نکته حاظ اهمیت وجود دارد که من آن را برای آخر گذاشتم. لاراول بعد از نصب بصورت پیش فرض یک APP_KEY
تنظیم می کند و آن را در فایل .env
قرار میدهد. شاید برای شما سوال پیش پیاد کاربرد این کلید چی هست. یکی از کاربرد های این کلید آنکد و دیکد کردن کوکی هست. لاراول بصورت پیش فرض همه کوکی ها را آنکد می کند، تا مانع از فاش شدن محتوای آنها شود. اما وقتی کوکی ما با استفاده از کلید یکی از برنامه ها آنکد شده نمی تونیم با کلید به غیر از آن کلید کوکی را دیکد کنیم. پس راه حل چیست؟ یکی از راه حل ها این است که کلید APP_KEY
را از یکی از برنامه های لاراولی تان کپی و سپس در همه برنامه های لاراولی دیگر پیست کنید.
یادداشت
من به شخصه روش دوم یعنی ردیس رو پیشنهاد می کنم. چرا؟ برای مثال ما هزار یوزر داریم و هر یوزر ممکن است در روز چندین بار وارد و خارج بشود، به نظر شما چه مقدار از سشن ها در دیتابیس ذخیره می شود، واقعا تعداد خیلی زیاد خواهد بود و وقتی حجم اطلاعات دیتابیس افزایش پیدا می کنه باعث افزایش latency
کوئری ها میشه و ... از مشکلات میشه و حتی اگر هزار یوزر نداشته باشیم، دیتابیس های مثل MySQL
و ... کلا سرعت دیتابیس های مثل ردیس را ندارد و ردیس در این مورد خیلی سریع عمل می کند. و اضافه کنم انتخاب با شماست، هر کدام را صلاح میدونید انتخاب کنید.
- دوستان بعد از پیاده سازی هر کدام از روش های بالا اقدام به پاک کردن کوکی ها و سشن ها کنید و تست کنید.
- اگر برای پیاده سازی قابلیت
Session Multi-subdomain
روش دوم را گزینش کرده اید، فراموش نکنید که مراحل مربوط را در همه برنامه هاتان تکرار کنید.
خیلی سپاس گذارم بخاطر اینکه تا آخر مقاله با ما همراه بودید. و فراموش نکنید نظراتان را با ما به اشتراک بگذارید.
منابع: Medium, Stackoverflow