我正在尝试使用中间件对 laravel 进行身份验证,但我的中间件无法重定向到管理/仪表板页面
我的代码如下
数据库中有 roll_as 为 1 的数据,我尝试以管理员身份登录,但是当我输入登录凭据时,中间件将我重定向到 /home 页面
帮我
我的所有代码都在下面
// 这是 adminMiddleware
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Auth;
class AdminMiddleware
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if(!Auth::user()->roll_as =='1'){
return redirect('/home')->with('status','Access Denied Becouse You Are Not Admin This Acces Only For Admin');
}
return $next($request);
}
}
/// LoginController
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\App\Http\Middleware\Authenticate;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
// protected $redirectTo = RouteServiceProvider::HOME;
protected function authenticated()
{
if(Auth::user()->roll_as=='1'){
return redirect('admin/dashboard')->with('status','Welcome Admin');
}
else{
return redirect('/home')->with('status','Welocome You are logged In Succesfully');
}
}
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
//web.php
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::group(['prefix' => 'admin','middleware'=>(['auth','asAdmin'])], function () {
Route::get('dashboard', [App\Http\Controllers\Admin\DashboardController::class,'index']);
});
//kernal.php
*/
protected $middlewareAliases = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \App\Http\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'asAdmin' => \App\Http\Middleware\AdminMiddleware::class,
];
我正在尝试制作中间件,但这个中间件不起作用
请帮助我
我认为你的中间件上的条件是错误的。
!Auth::user()->roll_as
我认为它是 false
所以你在中间件中的条件是 if (false == '1')
所以它总是不符合条件。您应该尝试删除条件开始时的!
并将其更改为Auth::user()->roll_as !== '1'
因为!运算符的优先级高于 == 运算符,!运营商将首先发生。参考更多https://www.php.net/manual/en/language.operators.precedence.php
你可以这样做:
// 你可以用 1 代替 '1'
if(Auth::user()->roll_as != '1'){
return redirect('/home')->with('status','Access Denied Becouse You Are Not Admin This Acces Only For Admin');
}
或:
// 你可以用 1 代替 '1'
if(!(Auth::user()->roll_as == '1')){
return redirect('/home')->with('status','Access Denied Because You Are Not Admin This Acces Only For Admin');
}
或者如果Auth::user()->roll_as是整数类型,可以使用:
Auth::user()->roll_as !== 1
如果Auth::user()->roll_as是字符串类型,应该是:
Auth::user()->roll_as !== '1'
参考https://www.php.net/manual/en/language.operators.comparison.php