من یک اپ دارم با دو دشبورد یکی برای ادمین یکی برای یوزر ها،حالا میخوام بعد از اینکه لاگین شدم و دکمه برگشت رو زدم نره تو صفحه لاگین،بره توی ایندکس یا همون صفحه اصلی وبسایتم
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
}
}
سلام ، باید چک کنید اگر کاربر لاگین شده بود ریدایرکت بشه ، این باید جایی چک بشه که صفحه لاگین رو نمایش میده یعنی در واقع در کنترلری که فانکشن لاگین رو دارید : من خودم سشنی که برای کاربر ست کردم رو میگیرم و طبق اون ریدایرکت میکنم :
if (!$request->session()->has('person')) {
$username = $request->username;
$price = $request->price;
return view('login', compact('username', 'price'));
}
return redirect('/');
سلام من یک تابع تعریف کردم به اسم 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
درصورتیکه این آدم لاگین کرده رول داره و نباید برگرده به صفحه لاگین باید ریدایرکت بشه به ایندکس اگر بک رو کلیک کرد.
سلام
در ابتدای کلس لاگین و رجیستر کنترلرت این فانکشن رو اضافه کن.
public function __construct()
{
if (Auth::user())
return redirect()
->route('index'); # Route name
}
web.php :
Route::get('/', [indexController::class, 'index'])->name('index');
هرچند خود رجیستر لاراول این فیچر رو داره!
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟