راکت
bardia
bardia
توسط 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

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

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

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

 return redirect('/');

حل میشه


Extern
Extern
@Extern8 سال پیشمطرح شد
0

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

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

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

$request->user()

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

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

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


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

@juza666
بله صدا زدم


bardia
bardia
تخصص :Golang/Laravel
@mrbardia728 سال پیشمطرح شد
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
bardia
تخصص :Golang/Laravel
@mrbardia728 سال پیشمطرح شد
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
bardia
تخصص :Golang/Laravel
@mrbardia728 سال پیشمطرح شد
1

@hesammousavi

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


Extern
Extern
@Extern8 سال پیشمطرح شد
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');
    }
}

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

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

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

        return redirect('/');

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


bardia
bardia
تخصص :Golang/Laravel
@mrbardia728 سال پیشمطرح شد
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

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

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


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

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

'isadmin' =>AppHttpMiddlewareisadmin::class,

اینم روت بنده

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

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


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

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


bardia
bardia
تخصص :Golang/Laravel
@mrbardia728 سال پیشمطرح شد
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');
    }
}

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

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

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

 return redirect('/');

حل میشه


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

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