laravel 中间件未按预期工作
laravel middleware not working as expected
为了保护用户路由和管理员路由,我创建了两个中间件
我的 UserMiddleware 看起来像这样
<?php
namespace App\Http\Middleware;
use Auth;
use Closure;
class UserMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::user()->hasRole('user')) {
return $next($request);
}
throw new \Exception("Unauthorized");
}
}
这是我的管理中间件
<?php
namespace App\Http\Middleware;
use Auth;
use Closure;
use App\Role;
class AdminMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::user()->hasRole('admin')) {
return $next($request);
}
throw new \Exception("Unauthorized");
}
}
现在我想要的是当管理员登录时,我希望打开管理仪表板,当用户登录时,我希望打开用户仪表板,但现在,它只将我重定向到管理员路由当我尝试从用户和管理员登录时,我有这样的用户保护路由
Route::group(['middleware' => 'auth', 'user'], function () {
//all user routes
});
和管理员保护路由
Route::group(['middleware' => 'auth', 'admin'], function () {
//all admin routes
});
并且在我的 kernel.php 中,我还添加了
'admin' => \App\Http\Middleware\AdminMiddleware::class,
'user' => \App\Http\Middleware\UserMiddleware::class,
这就是我在控制器中验证登录的方式
$loginData = array(
'email' => Input::get('email'),
'password' => Input::get('password'),
'confirmed' => 1
);
/*
* Checking against the record in database whether the email and password is valid
* Or the record exists in the database
*/
if (Auth::validate($loginData)) {
if (Auth::attempt($loginData)) {
return Redirect::intended('dashboard');
}
}
else {
// if any error send back with message.
Session::flash('error', 'Invalid Email/Password Combination');
return Redirect::to('login');
}
如何让我的中间件工作并在管理员登录时显示管理仪表板,在用户登录时显示用户仪表板。这给我带来了一个大问题。
首先,如果你想向未经授权的用户显示登录表单,你的中间件应该重定向到登录表单。为了拥有它,替换
throw new \Exception("Unauthorized");
和
return redirect(route('login'));
其次,您的登录控制器应该将用户重定向到与其角色相对应的仪表板。为了获得正确的重定向,替换
if (Auth::attempt($loginData)) {
return Redirect::intended('dashboard');
}
和
if (Auth::attempt($loginData)) {
return Redirect::intended(Auth::user()->hasRole('admin') ? 'admin_dashboard' : 'user_dashboard');
}
最后一个问题是您错误地将中间件应用于路由。如果你想应用多个中间件,你需要传递一个列表作为 middleware 参数。替换
['middleware' => 'auth', 'user']
和
['middleware' => ['auth', 'user']]
为了保护用户路由和管理员路由,我创建了两个中间件
我的 UserMiddleware 看起来像这样
<?php
namespace App\Http\Middleware;
use Auth;
use Closure;
class UserMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::user()->hasRole('user')) {
return $next($request);
}
throw new \Exception("Unauthorized");
}
}
这是我的管理中间件
<?php
namespace App\Http\Middleware;
use Auth;
use Closure;
use App\Role;
class AdminMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::user()->hasRole('admin')) {
return $next($request);
}
throw new \Exception("Unauthorized");
}
}
现在我想要的是当管理员登录时,我希望打开管理仪表板,当用户登录时,我希望打开用户仪表板,但现在,它只将我重定向到管理员路由当我尝试从用户和管理员登录时,我有这样的用户保护路由
Route::group(['middleware' => 'auth', 'user'], function () {
//all user routes
});
和管理员保护路由
Route::group(['middleware' => 'auth', 'admin'], function () {
//all admin routes
});
并且在我的 kernel.php 中,我还添加了
'admin' => \App\Http\Middleware\AdminMiddleware::class,
'user' => \App\Http\Middleware\UserMiddleware::class,
这就是我在控制器中验证登录的方式
$loginData = array(
'email' => Input::get('email'),
'password' => Input::get('password'),
'confirmed' => 1
);
/*
* Checking against the record in database whether the email and password is valid
* Or the record exists in the database
*/
if (Auth::validate($loginData)) {
if (Auth::attempt($loginData)) {
return Redirect::intended('dashboard');
}
}
else {
// if any error send back with message.
Session::flash('error', 'Invalid Email/Password Combination');
return Redirect::to('login');
}
如何让我的中间件工作并在管理员登录时显示管理仪表板,在用户登录时显示用户仪表板。这给我带来了一个大问题。
首先,如果你想向未经授权的用户显示登录表单,你的中间件应该重定向到登录表单。为了拥有它,替换
throw new \Exception("Unauthorized");
和
return redirect(route('login'));
其次,您的登录控制器应该将用户重定向到与其角色相对应的仪表板。为了获得正确的重定向,替换
if (Auth::attempt($loginData)) {
return Redirect::intended('dashboard');
}
和
if (Auth::attempt($loginData)) {
return Redirect::intended(Auth::user()->hasRole('admin') ? 'admin_dashboard' : 'user_dashboard');
}
最后一个问题是您错误地将中间件应用于路由。如果你想应用多个中间件,你需要传递一个列表作为 middleware 参数。替换
['middleware' => 'auth', 'user']
和
['middleware' => ['auth', 'user']]