ایجاد middleware برای تشخیص userها

- 1 سال پیش
توسط حسام موسوی آپدیت شد
Arshavir ( 22016 تجربه )
1 سال پیش
تخصص : Golang/Laravel

من دوتا پنل دارم
یکی برای ادمین و یکی برای کاربران
توی جدول user یه فیلد اضافه کردم به نام isadmin یعنی اگر 1بود ادمین و اگر صفر بود کاربر رو ببر به پنل خودش
من اینو اینجوری ایجاد کردم

php artisan make:middleware Admin

بعدش کد زیر روی توی کلاس Admin نوشتم

public function handle($request, Closure $next)
{
if(auth()->user()->isAdmin == 1){
return $next($request);
}
return redirect(‘home’)->with(‘error’,’You have not admin access’);
}

و بعدش کلاس فوق رو توی فایلKernelصدا زدم
اینم routeمن

Route::get(‘admin/routes’, ‘HomeController@admin’)->middleware(‘admin’);

ولی پیغام خطای زیر رو میده

Trying to get property of non-object
بهترین پاسخ انتخاب شده توسط Arshavir
حسام موسوی
1 سال پیش

خوب دقت کنید شما میگید اگر طرف admin نبود دوباره بره صفحه Apanel در این خط

خوب زمانی که میزنید /Apanel چون ادمین نیستید دوباره redirect میشه به Apanel و در نهایت چنین اروری میده این redirect رو تغییر بدید به صفحه اصلی یعنی

 return redirect('/');

حل میشه

Extern ( 1218 تجربه )
1 سال پیش

سلام.
فراخوانی Auth اشتباه هست :
باید به این صورت بنویسید در حالت کلی :

Auth::user()->isAdmin == 1

و در حالت کلی در فایل middleware به این صورت هم میتونید به کاربر دسترسی داشته باشید :

$request->user()
سیدعلی موسوی ( 30926 تجربه )
1 سال پیش
تخصص : برنامه نویسی سی شارپ و لاراول

حروف بزرگ و کوچک رو دقت کنید ممکنه از اون باشه، ادمین رو تویی ساخت میدلور بزرگ نوشتی ، ولی برای روت کوچیک صداش زدی. این میتونه یک دلیل باشه.

دوم میدولور رو تویی کرنل صدا زدی؟؟

Arshavir ( 22016 تجربه )
1 سال پیش
تخصص : Golang/Laravel

@juza666
بله صدا زدم

Arshavir ( 22016 تجربه )
1 سال پیش
تخصص : Golang/Laravel

@Extern
یعنی این طوری بنویسیم

public function handle($request, Closure $next)
{
if(auth::user()->isAdmin == 1){
return $next($request);
}
return redirect(‘home’)->with(‘error’,’You have not admin access’);
}
Arshavir ( 22016 تجربه )
1 سال پیش
تخصص : Golang/Laravel

@Extern
به صورت زیر نوشتم اما باز خطا میده

namespace App\Http\Middleware;

use Closure;
use Auth;
class isadmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::user()->isadmin == 1){
            return $next($request);
            }
            return redirect('/Apanel');
    }
}

اینم خطا

ErrorException (E_NOTICE)
Trying to get property of non-object

در واقع توی نمایش خطا به این خط اشاره داره

 if(Auth::user()->isadmin == 1)
Arshavir ( 22016 تجربه )
1 سال پیش
تخصص : Golang/Laravel

@hesammousavi

مشکل فوق رو چطور حل کنم؟

Extern ( 1218 تجربه )
1 سال پیش

اگر فیلد رو در دیتابیس تعریف کرده باشید نباید مشکلی داشته باشید
ارور به دلیل عدم دریافت مقدار هست.
فیلد isadmin اگر هست

namespace AppHttpMiddleware;

use Closure;
use Auth;
class isadmin
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if($request->user() !== NULL){
            if($request->user()->isadmin == 1) {
            return $next($request);
            }
        }
            return redirect('/Apanel');
    }
}
حسام موسوی ( 168424 تجربه )
1 سال پیش
تخصص : طراح و برنامه نویس

سلام @@sajad.kazemi1993
ببینید فک کنم بخاطر اینکه شما اول باید چک کنید که کاربر اصلا لاگین کرده یا نه اگر کرده بود بعد بیاد چک کنه تقریبا میشه یه چی در حد کد زیر

 if(auth()->check()) {
            if(auth()->user()->isAdmin())
                return $next($request);
        }

        return redirect('/');

حالا بر اساس نیاز تغییر میدید redirect کردن رو این دستور میگه اگر کاربر admin بود اجازه دسترسی به روت مورد نظر رو بهش بده

Arshavir ( 22016 تجربه )
1 سال پیش
تخصص : Golang/Laravel

@hesammousavi
@Extern
من از روش های پیشنهادی خودتون استفاده کردم اما به خطای مرورگری زیر برمیخورم مشکل از کجاست دقیقا؟

This page isn’t working
127.0.0.1 redirected you too many times.
Try clearing your cookies.
ERR_TOO_MANY_REDIRECTS
حسام موسوی ( 168424 تجربه )
1 سال پیش
تخصص : طراح و برنامه نویس

مشخصا شما بخشی رو اشتباه پیاده سازی میکنید چون این ارور زمانی داده میشه که شما وارد یک روت میشید و middleware رو طوری پیاده سازی کردید که بارها redirect میکنه به همون روت .
شما این میلدور رو کجا قرار دادید ؟
شما باید این رو برای روت های admin قرار بدید تا زمانی که کاربر روت ادمین /admin رو زد برای مثال اگر شرط درست بود ادامه و ببینه اگر نبود redirect بشه به صفحه ای که شما میخواید باید در قسمت routeMiddleware بخش kernel قرار بدید این میدلور رو و در نهایت تنها روی روت admin فراخونیش کنید.
کاملا موضوع ساده و قابل درکیه .

Arshavir ( 22016 تجربه )
1 سال پیش
تخصص : Golang/Laravel

@hesammousavi
منم دقیقا این کار رو کردم که شما می فرمایید
من توی قسمت kernel.php وراد کردم به صورت زیر

'isadmin' =>AppHttpMiddlewareisadmin::class,

اینم روت بنده

Route::middleware('isadmin')->get('/Apanel', 'panel_admin@show');

اما بازم نمیشه

حسام موسوی ( 168424 تجربه )
1 سال پیش
تخصص : طراح و برنامه نویس

کدی که برای این میدلور ثبت کردید رو دوباره اینجا ارسال کنید

Arshavir ( 22016 تجربه )
1 سال پیش
تخصص : Golang/Laravel

@hesammousavi

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class isadmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        //if($request->user() !== NULL){
            if(auth::check()) {
        if(auth::user()->isadmin == 1){
            return $next($request);
            }
        }
            return redirect('/Apanel');
    }
}
حسام موسوی ( 168424 تجربه )
1 سال پیش
تخصص : طراح و برنامه نویس

خوب دقت کنید شما میگید اگر طرف admin نبود دوباره بره صفحه Apanel در این خط

خوب زمانی که میزنید /Apanel چون ادمین نیستید دوباره redirect میشه به Apanel و در نهایت چنین اروری میده این redirect رو تغییر بدید به صفحه اصلی یعنی

 return redirect('/');

حل میشه

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