fr
3 سال پیش توسط fr مطرح شد
3 پاسخ

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

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

web.php

Route::middleware(['prevent-back-history'])->group(function () {
    Auth::routes();
});
Route::prefix('user')->name('user.')->middleware(['user', 'auth'])->group(function () {
    Route::get('dashboard', [UserController::class, 'index'])->name('dashboard');
    Route::get('profile', [UserController::class, 'profile'])->name('profile');
    Route::get('setting', [UserController::class, 'setting'])->name('setting');
});

Route::prefix('admin')->name('admin.')->middleware(['admin', 'auth'])->group(function () {
    Route::get('dashboard', [AdminController::class, 'index'])->name('dashboard');
    Route::get('profile', [AdminController::class, 'profile'])->name('profile');
    Route::get('setting', [AdminController::class, 'setting'])->name('setting');
});

middleware RedirectIfAuthenticated


<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @param  string|null  ...$guards
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next, ...$guards)
    {
        $guards = empty($guards) ? [null] : $guards;

        foreach ($guards as $guard) {
            if (Auth::guard($guard)->check()) {
                /** @var User $user */
                $user = Auth::guard($guard);
                // to admin dashboard
                if($user->hasRole('admin')) {
                    return redirect(route('admin_dashboard'));
                }
                // to user dashboard
                else if($user->hasRole('user')) {
                    return redirect(route('user.dashboard'));
                }
            }

        }

        return $next($request);
    }
}

IsAdminMiddleware

<?php

namespace App\Http\Middleware;

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

class IsAdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        if( Auth::check() )
        {
            /** @var User $user */
            $user = Auth::user();

            // if user is not admin take him to his dashboard
            if ( $user->hasRole('user') ) {
                return redirect(route('user.dashboard'));
            }

            // allow admin to proceed with request
            else if ( $user->hasRole('admin') ) {
                return $next($request);
            }
        }

        abort(403);  // permission denied error
    }

}

IsUserMiddleware

<?php

namespace App\Http\Middleware;

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

class IsUserMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        if( Auth::check() )
        {
            /** @var User $user */
            $user = Auth::user();

            // if user is not admin take him to his dashboard
            if ( $user->hasRole('admin') ) {
                return redirect(route('admin_dashboard'));
            }

            // allow admin to proceed with request
            else if ( $user->hasRole('user') ) {
                return $next($request);
            }
        }

        abort(403);  // permission denied error
    }
}

ثبت پرسش جدید
فرشید مرادی
تخصص : noob
@eniack 3 سال پیش مطرح شد
0

سلام ، باید چک کنید اگر کاربر لاگین شده بود ریدایرکت بشه ، این باید جایی چک بشه که صفحه لاگین رو نمایش میده یعنی در واقع در کنترلری که فانکشن لاگین رو دارید : من خودم سشنی که برای کاربر ست کردم رو میگیرم و طبق اون ریدایرکت میکنم :

 if (!$request->session()->has('person')) {
            $username = $request->username;
            $price = $request->price;
            return view('login', compact('username', 'price'));
        }
        return redirect('/');

fr
@f.alabakhsh 3 سال پیش مطرح شد
0

سلام من یک تابع تعریف کردم به اسم hasrole() در مدل یوزر

 public function hasRole(string $role): bool
    {
        return $this->getAttribute('role') === $role;
    } ```
این میاد چک میکنه اگه ادمین بود یا اگه یوزر معمولی بود به من خبر بده!
و توی ریدایرکت به وسیله گاردها مشخص کردم رول من ادمین بود  ببرش داشبورد ادمین  اگه یوزر معمولی بود ببرش داشبورد یوزر معمولی و همچنین بعد به وسیله میدلورهای ادمین و یوزر معمولی اومدم گفتم به کدوم داشبورد هدایت بشه! 
من مشکلم توی ریدایرکت نیست
مشکل من اینجاست که بعد از لاگین شدن  که هرکس ریدایرکت میشه به داشبورد خودش اگر "بک" بزنه تو مرور گر دوباره صفحه لاگین رو نمایش میده با یک ارور که 

BadMethodCallException
Method Illuminate\Auth\SessionGuard::hasRole does not exist.
http://localhost:8000/login


درصورتیکه این آدم لاگین کرده رول داره و نباید برگرده به صفحه لاگین باید ریدایرکت بشه به ایندکس اگر بک رو کلیک کرد.

Sahandi81
تخصص : PHP - Laravel -JS
@sahandi81 3 سال پیش آپدیت شد
0

سلام
در ابتدای کلس لاگین و رجیستر کنترلرت این فانکشن رو اضافه کن.

public function __construct()
    {
        if (Auth::user())
            return redirect()
                ->route('index'); # Route name
    }

web.php :

Route::get('/', [indexController::class, 'index'])->name('index');

هرچند خود رجیستر لاراول این فیچر رو داره!


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

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