【问题标题】:laravel middleware not working as expectedlaravel 中间件没有按预期工作
【发布时间】:2015-11-09 03:37:26
【问题描述】:

我创建了两个中间件来保护用户路由和管理员路由

我的 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');
}

如何使我的中间件工作并在管理员日志时显示管理仪表板,在用户登录时显示用户仪表板。这给我带来了一个大问题。

【问题讨论】:

    标签: php laravel routing laravel-5 laravel-5.1


    【解决方案1】:

    首先,如果您想向未经授权的用户显示登录表单,您的中间件应该重定向到登录表单。为了拥有它,请替换

    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']]
    

    【讨论】:

    • 好吧,给了我一个关于如何使用的想法,但是在这条线上遇到了问题return Redirect::intended(Auth::user()-&gt;hasRole('admin') &gt; 'admin_dashboard' : 'user_dashboard');
    • 抱歉,打错了,刚刚改正
    • 偏航它正在工作,但现在当我尝试通过 url 访问而不像 www.example.com/administrator 这样登录时,它可以让我直接访问管理员仪表板。但用户仪表板工作正常。可能是什么问题?
    • 中间件没有运行。以与用户路由组相同的方式更新管理路由组中间件
    • 我已经像Route::group(['middleware' =&gt; ['auth', 'admin']]那样做了
    猜你喜欢
    • 2016-12-08
    • 2018-08-27
    • 1970-01-01
    • 2021-11-24
    • 2017-08-27
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多