1

我正在创建一个中间件,用于检查用户当前是否已登录并且是超级管理员。

这是我的中间件代码。

namespace App\Http\Middleware;

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

class CheckAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->guest()) {

            // also need to check a field of user

            return redirect()->guest('login');
        } else {
            return $next($request);
        }
    }
}

其实和默认的中间件Authenticate(即'auth')是一样的

当我在应用程序的路由中使用它时,它运行良好。(app/Http/routes.php)

我需要将它与cuddy 插件中间件选项一起使用。它应该只重定向来宾用户,但事实并非如此。请帮忙!

4

2 回答 2

0

默认情况下,验证中间件会检查用户是否是访客并将他重定向到登录页面,见下文

 if (Auth::guard($guard)->guest()) {
        if ($request->ajax() || $request->wantsJson()) {
            return response('Unauthorized.', 401); //if ajax request
        } else {
            return redirect()->guest('login'); //redirect
        }
    }

现在,如果您想检查用户是否已登录并在此处检查一些用户字段应该如何

public function handle($request, Closure $next, $guard = null)
{
    if(Auth::check())  { //If is logged in
        $user = Auth::user();
        if($user->isSuperAdmin())
            return $next($request);
    }
    return redirect('/whatever');
}

如果您附加 'auth' 中间件 + 此自定义中间件。您可以在自定义中间件中去掉“Auth::check()”。

Route::group(['middleware' => ['web', 'auth', 'custom']], function () {
   Route::get('/url/only/for/super/users', 'Whatever@whateverController');
});

 public function handle($request, Closure $next, $guard = null)
{
        $user = Auth::user();
        if($user->isSuperAdmin())
            return $next($request);
    return redirect('/whatever');
}
于 2016-04-30T14:42:03.827 回答
0

laravel 中有很多辅助函数,你可以在任何地方使用,比如 auth() 辅助函数,参见 helpers。因此,您可以在任何地方使用此代码:

auth()->user();
于 2016-05-01T08:35:33.267 回答