من دوتا پنل دارم
یکی برای ادمین و یکی برای کاربران
توی جدول 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
خوب دقت کنید شما میگید اگر طرف admin نبود دوباره بره صفحه Apanel در این خط
خوب زمانی که میزنید /Apanel چون ادمین نیستید دوباره redirect میشه به Apanel و در نهایت چنین اروری میده این redirect رو تغییر بدید به صفحه اصلی یعنی
return redirect('/');
حل میشه
سلام.
فراخوانی Auth اشتباه هست :
باید به این صورت بنویسید در حالت کلی :
Auth::user()->isAdmin == 1
و در حالت کلی در فایل middleware به این صورت هم میتونید به کاربر دسترسی داشته باشید :
$request->user()
حروف بزرگ و کوچک رو دقت کنید ممکنه از اون باشه، ادمین رو تویی ساخت میدلور بزرگ نوشتی ، ولی برای روت کوچیک صداش زدی. این میتونه یک دلیل باشه.
دوم میدولور رو تویی کرنل صدا زدی؟؟
@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)
اگر فیلد رو در دیتابیس تعریف کرده باشید نباید مشکلی داشته باشید
ارور به دلیل عدم دریافت مقدار هست.
فیلد 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');
}
}
سلام @@sajad.kazemi1993
ببینید فک کنم بخاطر اینکه شما اول باید چک کنید که کاربر اصلا لاگین کرده یا نه اگر کرده بود بعد بیاد چک کنه تقریبا میشه یه چی در حد کد زیر
if(auth()->check()) {
if(auth()->user()->isAdmin())
return $next($request);
}
return redirect('/');
حالا بر اساس نیاز تغییر میدید redirect کردن رو این دستور میگه اگر کاربر admin بود اجازه دسترسی به روت مورد نظر رو بهش بده
@hesammousavi
@Extern
من از روش های پیشنهادی خودتون استفاده کردم اما به خطای مرورگری زیر برمیخورم مشکل از کجاست دقیقا؟
This page isn’t working
127.0.0.1 redirected you too many times.
Try clearing your cookies.
ERR_TOO_MANY_REDIRECTS
مشخصا شما بخشی رو اشتباه پیاده سازی میکنید چون این ارور زمانی داده میشه که شما وارد یک روت میشید و middleware رو طوری پیاده سازی کردید که بارها redirect میکنه به همون روت .
شما این میلدور رو کجا قرار دادید ؟
شما باید این رو برای روت های admin قرار بدید تا زمانی که کاربر روت ادمین /admin رو زد برای مثال اگر شرط درست بود ادامه و ببینه اگر نبود redirect بشه به صفحه ای که شما میخواید باید در قسمت routeMiddleware بخش kernel قرار بدید این میدلور رو و در نهایت تنها روی روت admin فراخونیش کنید.
کاملا موضوع ساده و قابل درکیه .
@hesammousavi
منم دقیقا این کار رو کردم که شما می فرمایید
من توی قسمت kernel.php وراد کردم به صورت زیر
'isadmin' =>AppHttpMiddlewareisadmin::class,
اینم روت بنده
Route::middleware('isadmin')->get('/Apanel', 'panel_admin@show');
اما بازم نمیشه
<?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');
}
}
خوب دقت کنید شما میگید اگر طرف admin نبود دوباره بره صفحه Apanel در این خط
خوب زمانی که میزنید /Apanel چون ادمین نیستید دوباره redirect میشه به Apanel و در نهایت چنین اروری میده این redirect رو تغییر بدید به صفحه اصلی یعنی
return redirect('/');
حل میشه
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟