hossein
5 سال پیش توسط hossein مطرح شد
16 پاسخ

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

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

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

یا

if ( Auth::check())

چیکار کنم؟


ثبت پرسش جدید
حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
0

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

if (Auth::check())
        {
            return $next($request);
        } else{
            return abort(404);
        }

hossein
تخصص : توسعه دهنده
@emperatur133 5 سال پیش مطرح شد
0

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


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 5 سال پیش مطرح شد
0

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

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

    }

hossein
تخصص : توسعه دهنده
@emperatur133 5 سال پیش مطرح شد
0

@endworld

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


Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 5 سال پیش مطرح شد
0

سلام
@emperatur133

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


hossein
تخصص : توسعه دهنده
@emperatur133 5 سال پیش آپدیت شد
0

@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
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 5 سال پیش مطرح شد
0

سلام

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

و وقتی لاگین میکنید توی یه کنترلر و متد یا یه روت اطلاعات یوزر لاگین شده رو 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
تخصص : توسعه دهنده
@emperatur133 5 سال پیش مطرح شد
0

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

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


hossein
تخصص : توسعه دهنده
@emperatur133 5 سال پیش مطرح شد
0

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


hossein
تخصص : توسعه دهنده
@emperatur133 5 سال پیش مطرح شد
0

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


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
0

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

if (Auth::check())
        {
            return $next($request);
        } else{
            return abort(404);
        }

hossein
تخصص : توسعه دهنده
@emperatur133 5 سال پیش مطرح شد
0

@hesammousavi

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

dd('sad');

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

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


hossein
تخصص : توسعه دهنده
@emperatur133 5 سال پیش مطرح شد
0

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

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


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
0

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


hossein
تخصص : توسعه دهنده
@emperatur133 5 سال پیش مطرح شد
حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
0

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


hossein
تخصص : توسعه دهنده
@emperatur133 5 سال پیش مطرح شد
0

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

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


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام