سلام. من یک Middleware دارم که تو قسمت $middleware تو کرنل معرفیش کردم چون میخوام برای تمامی درخواست های اجرا بشه
تا اینجا مشکلی نیست
مشکل این که تو middleware مربوطه میخوام چک کنم کاربر لاگین کرده و نقش فلانه این کارو بکنه یا یه کاردیگه
اما کد زیر کار نمیکنه یعنی اصلا شرط بررسی ورود کاربر همیشه false هست در صورتی که کاربر لاگین کرده
if ( Auth::user() && Auth::user()->role != 'client')
یا
if ( Auth::check())
چیکار کنم؟
سلام اول بررسی کنید اصلا میدلور مربوطه اجرا میشه یه کد تست توش بنویسید مثلا dd ببینید لاراول اونو اصلا اجرا میکنه یا نه . اگر اجرا نکرد خوب مشکل مشخصه باید اول درست در قسمت kenrnel قرار بدید ترجیحا هم در web بزارید .
و بعد اگر کار میکنه و تست اوکی بود کد زیر رو در قدم اول تست کنید
if (Auth::check())
{
return $next($request);
} else{
return abort(404);
}
درود...
کد زیر:
public function handle($request, Closure $next)
{
if (Auth::check() && Auth::user()->role->id == 1)
{
return $next($request);
} else{
return redirect()->route('login');
}
}
ممنون از این که جواب دادین
ولی این کدی که دادین فرق خاصی با کد من نداره
امتحان کردم . کار نکرد
اصلا Auth::check() بررسی نمیشه .
سلام
@emperatur133
اگر بررسی نشه که باید ارور بده
وقتی ارور نمیده یعنی مشکل از اینجا نیست
از جای دیگه هست
بقیه کد هارو چک کنید
کش و هیستوری مرور گر رو هم پاک کنید از اول چک کنید
سلام
من نمیگم بررسی نمیشه . چک میشه ولی همیشه Auth::check() را false برمیگردونه
در صورتی که کاربر لوگین کرده
if (Auth::check() && Auth::user()->role == 1)
{
return $next($request);
} else{
return abort(404);
}
میدلور رو غیرفعال میکنم لاگین انجام میدم . بعد که فعالش میکنم باز منو میفرسته به صفحه 404 در صورتی که من لاگین کردم و role من 1 هم هست
به نظر شما میشه دلیلش این باشه قبل از رسیدن به این میدلور احراز هویت بررسی نمیشه؟
چون الان کرنل من اینطوریه
protected $middleware = [
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\SiteMiddleware::class,
];
میدلوری AuthenticateSession قبلش نیست . البته این حالت پیشفرض هستش . این میدلور تو $middlewareGroups هست که به صورت کامنت هست به صورت پیشفرض
البته نمیدونم رو حدسم اینه
سلام
توی فایل کرنل این موارد رو جایگزین کنید که به حالت دیفالتش برگرده
و وقتی لاگین میکنید توی یه کنترلر و متد یا یه روت اطلاعات یوزر لاگین شده رو return کنید
ببینید چیزی اصلا بر میگردونه یا نه!
protected $middleware = [
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
یه مدل میدولوری هم من براتون کدش رو میزارم
متد handle رو ببینید
اینطوری هم میتونید پیش برید
نیم اسپیس ها و کلاس هارو هم اون بالا دقت کنید که حتما use شده باشه
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAdminAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(auth()->check()) {
if(auth()->user()->isAdmin())
return $next($request);
}
return back();
}
}
شما نسبت به چیزی که میخوایید تغییرش بدید
موفق باشید
@Alimotreb
آقا واقعا ممنون که کمک میکنید
گفتم که کرنل من همون پیشفرض هست. الان چک کردم دوباره
بله اطلاعات یوزر بعد لاگین تو کنترلر و روت میاد. الان Auth::check() یا Auth::user() تو کنترلر ها یا تو میدلور کار میکنه
فقط مشکل اینه تو میدلوری که تو قسمت routeMiddleware تو فایل Kernel تعریف میکنم درست کار میکنه یعنی تشخیص میده کاربر ورود کرده یا نه ولی اگه میدلور رو تو قسمت middleware فایل Kernel اضافه کنم اونجایی که میخوای برای تمام درخواست ها میدلورت کارکنه اونجا نمیتونه تشخیص بده کاربر لوگین شده یا نه . یعنی همیشه کاربر رو لوگین نکرده میبینه
واقعا نمیدونم چرا
شما میشه یه تست با لاراول خام تازه نصب شده بکنید.
تو مستنداتش هم چیزی پیدا نکردم
سلام اول بررسی کنید اصلا میدلور مربوطه اجرا میشه یه کد تست توش بنویسید مثلا dd ببینید لاراول اونو اصلا اجرا میکنه یا نه . اگر اجرا نکرد خوب مشکل مشخصه باید اول درست در قسمت kenrnel قرار بدید ترجیحا هم در web بزارید .
و بعد اگر کار میکنه و تست اوکی بود کد زیر رو در قدم اول تست کنید
if (Auth::check())
{
return $next($request);
} else{
return abort(404);
}
ممنون آقای موسوی
بله . کد
dd('sad');
رو تو میدلور گذاشتم اجرا شد. میدلور درست فراخوانی میشه. کدی که شما پیشنهاد دادی دقیقا همونیه که من نوشته بودم . اول گفتگو هست
اینکه گفتین در web بزارم رو متوجه نشدم.
کرنل سه بخش $middleware و $middlewareGroups و $routeMiddleware برای اینکه اون میدلور شما تو تمام ریکوئست ها اجرا بشه باید تو $middleware معرفی کنید دیگه؟ من این کار رو کردم
مشکل اینه که if (Auth::check()) همیشه false بر میگردونه
آقای موسوی دستت درد نکنه . درست شد تو قسمت $middlewareGroups تو آرایه web گذاشتم . حل شد
فقط اینکه من تو مستندات خونده بودم برای اینکه میدلور برای تمام ریکوئست اجرا بشه باید تو $middleware معرفی بشه
مگه اینطور نیست؟
الان تو web تعریف کردم برای اون اپلیکیشن هایی که با api وصل هستن اجرا نمیشه دیگه؟
خیر برای api اجرا نمیشه . بغیر اینکه در api هم بزارید .
البته در مورد اول باید اجرا بشه ،ورژن لاراول شما چنده ؟
شاید به این خاطر اجرا نمیشد که در اون قسمتی که روی همه روت ها میدلور اجرا میشه هنوز میدلورهای مربوط به کوکی و این موارد لود نشدن بنابراین نمیتونست مقدار کوکی و موارد دیگه رو بگیره
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟