bardia
6 سال پیش توسط bardia مطرح شد
14 پاسخ

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

من دوتا پنل دارم
یکی برای ادمین و یکی برای کاربران
توی جدول 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

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

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

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

 return redirect('/');

حل میشه


Extern
@Extern 6 سال پیش آپدیت شد
0

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

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

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

$request->user()

سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش مطرح شد
0

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

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


bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش مطرح شد
1

@juza666
بله صدا زدم


bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش مطرح شد
1

@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’);
}

bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش مطرح شد
1

@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)

bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش آپدیت شد
1

@hesammousavi

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


Extern
@Extern 6 سال پیش آپدیت شد
0

اگر فیلد رو در دیتابیس تعریف کرده باشید نباید مشکلی داشته باشید
ارور به دلیل عدم دریافت مقدار هست.
فیلد 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');
    }
}

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

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

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

        return redirect('/');

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


bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش مطرح شد
1

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

This page isn’t working
127.0.0.1 redirected you too many times.
Try clearing your cookies.
ERR_TOO_MANY_REDIRECTS

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

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


bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش آپدیت شد
1

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

'isadmin' =>AppHttpMiddlewareisadmin::class,

اینم روت بنده

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

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


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

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


bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش مطرح شد
0

@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');
    }
}

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

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

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

 return redirect('/');

حل میشه


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

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