کار نکردن Auth check در Middleware

- 3 هفته پیش
توسط hossein Emperatur آپدیت شد
hossein Emperatur ( 1880 تجربه )
1 ماه پیش

سلام. من یک Middleware دارم که تو قسمت $middleware تو کرنل معرفیش کردم چون میخوام برای تمامی درخواست های اجرا بشه
تا اینجا مشکلی نیست
مشکل این که تو middleware مربوطه میخوام چک کنم کاربر لاگین کرده و نقش فلانه این کارو بکنه یا یه کاردیگه
اما کد زیر کار نمیکنه یعنی اصلا شرط بررسی ورود کاربر همیشه false هست در صورتی که کاربر لاگین کرده

if ( Auth::user() && Auth::user()->role != 'client')

یا

if ( Auth::check())

چیکار کنم؟

بهترین پاسخ انتخاب شده توسط hossein Emperatur
حسام موسوی
3 هفته پیش

سلام اول بررسی کنید اصلا میدلور مربوطه اجرا میشه یه کد تست توش بنویسید مثلا dd ببینید لاراول اونو اصلا اجرا میکنه یا نه . اگر اجرا نکرد خوب مشکل مشخصه باید اول درست در قسمت kenrnel قرار بدید ترجیحا هم در web بزارید .
و بعد اگر کار میکنه و تست اوکی بود کد زیر رو در قدم اول تست کنید

if (Auth::check())
        {
            return $next($request);
        } else{
            return abort(404);
        }
hossein Emperatur ( 1880 تجربه )
1 ماه پیش

لطفا کسی کمک کنه

پایان جهان ( 54478 تجربه )
1 ماه پیش

درود...
کد زیر:

public function handle($request, Closure $next)
    {
        if (Auth::check() && Auth::user()->role->id == 1) 
        {
            return $next($request);
        } else{
            return redirect()->route('login');
        }

    }
hossein Emperatur ( 1880 تجربه )
1 ماه پیش

@endworld

ممنون از این که جواب دادین
ولی این کدی که دادین فرق خاصی با کد من نداره
امتحان کردم . کار نکرد
اصلا Auth::check() بررسی نمیشه .

Alimotreb ( 92492 تجربه )
1 ماه پیش

سلام
@emperatur133

اگر بررسی نشه که باید ارور بده
وقتی ارور نمیده یعنی مشکل از اینجا نیست
از جای دیگه هست
بقیه کد هارو چک کنید
کش و هیستوری مرور گر رو هم پاک کنید از اول چک کنید

hossein Emperatur ( 1880 تجربه )
1 ماه پیش

@Alimotreb

سلام
من نمیگم بررسی نمیشه . چک میشه ولی همیشه 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 هست که به صورت کامنت هست به صورت پیشفرض
البته نمیدونم رو حدسم اینه

Alimotreb ( 92492 تجربه )
1 ماه پیش

سلام

توی فایل کرنل این موارد رو جایگزین کنید که به حالت دیفالتش برگرده

و وقتی لاگین میکنید توی یه کنترلر و متد یا یه روت اطلاعات یوزر لاگین شده رو 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();
    }
}

شما نسبت به چیزی که میخوایید تغییرش بدید
موفق باشید

hossein Emperatur ( 1880 تجربه )
1 ماه پیش

@Alimotreb
آقا واقعا ممنون که کمک میکنید
گفتم که کرنل من همون پیشفرض هست. الان چک کردم دوباره
بله اطلاعات یوزر بعد لاگین تو کنترلر و روت میاد. الان Auth::check() یا Auth::user() تو کنترلر ها یا تو میدلور کار میکنه
فقط مشکل اینه تو میدلوری که تو قسمت routeMiddleware تو فایل Kernel تعریف میکنم درست کار میکنه یعنی تشخیص میده کاربر ورود کرده یا نه ولی اگه میدلور رو تو قسمت middleware فایل Kernel اضافه کنم اونجایی که میخوای برای تمام درخواست ها میدلورت کارکنه اونجا نمیتونه تشخیص بده کاربر لوگین شده یا نه . یعنی همیشه کاربر رو لوگین نکرده میبینه
واقعا نمیدونم چرا
شما میشه یه تست با لاراول خام تازه نصب شده بکنید.

تو مستنداتش هم چیزی پیدا نکردم

hossein Emperatur ( 1880 تجربه )
1 ماه پیش

کسی نمیتونه کمک کنه؟

hossein Emperatur ( 1880 تجربه )
1 ماه پیش

کسی راهی به ذهنش نمیرسه؟

حسام موسوی ( 138979 تجربه )
3 هفته پیش

سلام اول بررسی کنید اصلا میدلور مربوطه اجرا میشه یه کد تست توش بنویسید مثلا dd ببینید لاراول اونو اصلا اجرا میکنه یا نه . اگر اجرا نکرد خوب مشکل مشخصه باید اول درست در قسمت kenrnel قرار بدید ترجیحا هم در web بزارید .
و بعد اگر کار میکنه و تست اوکی بود کد زیر رو در قدم اول تست کنید

if (Auth::check())
        {
            return $next($request);
        } else{
            return abort(404);
        }
hossein Emperatur ( 1880 تجربه )
3 هفته پیش

@hesammousavi

ممنون آقای موسوی
بله . کد

dd('sad');

رو تو میدلور گذاشتم اجرا شد. میدلور درست فراخوانی میشه. کدی که شما پیشنهاد دادی دقیقا همونیه که من نوشته بودم . اول گفتگو هست
اینکه گفتین در web بزارم رو متوجه نشدم.
کرنل سه بخش $middleware و $middlewareGroups و $routeMiddleware برای اینکه اون میدلور شما تو تمام ریکوئست ها اجرا بشه باید تو $middleware معرفی کنید دیگه؟ من این کار رو کردم

مشکل اینه که if (Auth::check()) همیشه false بر میگردونه

hossein Emperatur ( 1880 تجربه )
3 هفته پیش

آقای موسوی دستت درد نکنه . درست شد تو قسمت $middlewareGroups تو آرایه web گذاشتم . حل شد
فقط اینکه من تو مستندات خونده بودم برای اینکه میدلور برای تمام ریکوئست اجرا بشه باید تو $middleware معرفی بشه

مگه اینطور نیست؟
الان تو web تعریف کردم برای اون اپلیکیشن هایی که با api وصل هستن اجرا نمیشه دیگه؟

حسام موسوی ( 138979 تجربه )
3 هفته پیش

خیر برای api اجرا نمیشه . بغیر اینکه در api هم بزارید .
البته در مورد اول باید اجرا بشه ،ورژن لاراول شما چنده ؟

hossein Emperatur ( 1880 تجربه )
3 هفته پیش

@hesammousavi

نسخه 5.8

حسام موسوی ( 138979 تجربه )
3 هفته پیش

شاید به این خاطر اجرا نمیشد که در اون قسمتی که روی همه روت ها میدلور اجرا میشه هنوز میدلورهای مربوط به کوکی و این موارد لود نشدن بنابراین نمیتونست مقدار کوکی و موارد دیگه رو بگیره

hossein Emperatur ( 1880 تجربه )
3 هفته پیش

اره احتمالش همینه
بالا هم همینو گفته بودم

ممنون از راهنماییتون

برای ارسال پاسخ باید وارد سایت شوید