استفاده از context درخواست
در حال حاضر منطق ما برای احراز هویت کاربر شامل بررسی ساده این است که آیا یک مقدار "authenticatedUserID" در دادههای نشست آنها وجود دارد یا نه، به این صورت:
func (app *application) isAuthenticated(r *http.Request) bool { return app.sessionManager.Exists(r.Context(), "authenticatedUserID") }
میتوانیم این بررسی را با پرسوجو از جدول users پایگاه داده خود قویتر کنیم تا مطمئن شویم که مقدار "authenticatedUserID" یک مقدار واقعی و معتبر است (یعنی حساب کاربری کاربر را از زمان آخرین ورود آنها حذف نکردهایم).
اما یک مشکل جزئی در انجام این بررسی اضافی پایگاه داده وجود دارد.
helper isAuthenticated() ما بهطور بالقوه میتواند چندین بار در هر چرخه درخواست فراخوانی شود. در حال حاضر ما آن را دو بار استفاده میکنیم — یک بار در middleware requireAuthentication() و دوباره در helper newTemplateData(). بنابراین، اگر مستقیماً از helper isAuthenticated() از پایگاه داده پرسوجو کنیم، در نهایت سفرهای تکراری به پایگاه داده در هر درخواست انجام میدهیم. و این خیلی کارآمد نیست.
یک رویکرد بهتر این است که این بررسی را در یک middleware انجام دهیم تا تعیین کنیم که آیا درخواست فعلی از یک کاربر احراز هویت شده است یا نه، و سپس آن اطلاعات را به تمام handlerهای بعدی در زنجیره منتقل کنیم.
پس چگونه این کار را انجام دهیم؟ وارد context درخواست شوید.
در این بخش یاد خواهید گرفت:
- context درخواست چیست و چه زمانی از آن استفاده کنیم.
- انتقال وضعیت احراز هویت بین handlerها با middleware و context.