Laravel - 如果用户未经过身份验证,如何重定向到登录

时间:2015-12-04 13:51:11

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

我尝试使用扩展类中的__constructorAdminController扩展AdminBaseController),但显然它不起作用,我不知道是什么可以,在这里你可以看到我的两个课程:

AdminBaseController.php

class AdminBaseController extends Controller
{
    public function __construct(){
        if (!Auth::user()){
            return view('admin.pages.login.index');
        }
    }
}

AdminController.php

class AdminController extends AdminBaseController
{
    public function __construct(){
        parent::__construct();
    }

    public function index()
    {
        return view('admin.pages.admin.index');
    }

    public function ajuda()
    {
        return view('admin.pages.admin.ajuda');
    }
}

修改

这是我的admin路线组:

Route::group([
    'prefix' => 'admin',
    'middleware' => 'auth'
], function () {
    Route::get('/', 'Admin\AdminController@index');

    Route::get('login', 'Admin\AuthController@getLogin');
    Route::post('login', 'Admin\AuthController@postLogin');
    Route::get('logout', 'Admin\AuthController@getLogout');

    Route::group(['prefix' => 'configuracoes'], function () {
        Route::get('geral', 'Admin\AdminConfiguracoesController@geral');
        Route::get('social', 'Admin\AdminConfiguracoesController@social');
        Route::get('analytics', 'Admin\AdminConfiguracoesController@analytics');
    });

    Route::get('ajuda', 'Admin\AdminController@ajuda');
});

4 个答案:

答案 0 :(得分:13)

控制器不是检查用户是否经过身份验证的正确位置。你应该使用中间件。要获取有关中间件检查内容的信息here

让我们看看如何使用默认的Laravel auth中间件来实现此目的:

首先摆脱你的AdminBaseController并仅使用AdminController

然后你必须检查auth

文件中是否启用了app\Http\Kernel.php中间件

你应该有一行:

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,

这意味着中间件处于活动状态并可用于您的路由。

现在让我们进入app\Http\Middleware\Authenticate.php中的中间件类来指定中间件的行为:

//this method will be triggered before your controller constructor
public function handle($request, Closure $next)
{
    //check here if the user is authenticated
    if ( ! $this->auth->user() )
    {
        // here you should redirect to login 
    }

    return $next($request);
}

现在唯一要做的就是决定应该应用中间件的路由。假设您有两条路径只能从经过身份验证的用户访问,您应该指定以这种方式使用这两条路由的中间件:

Route::group( ['middleware' => 'auth' ], function()
{
    Route::get('admin/index', 'AdminController@index');
    Route::get('admin/ajuda', 'AdminController@ajuda');
});

答案 1 :(得分:3)

为此目的使用中间件,然后在控制器构造函数中使用它,如下例所示。

public function __construct()
{
    $this->middleware('guest', ['except' => 'logout']);
}

然后,您需要保护用户登录的路径以便访问。

Route::group(['middleware' => 'auth'], function() {
      Route::get('/dashboard', 'DashboardController@index');
});

答案 2 :(得分:2)

在Laravel 5.5中,未经身份验证的用户将导致Authenticate中间件抛出AuthenticationException异常。

protected function authenticate(array $guards)
{
 if (empty($guards))
 {
  return $this->auth->authenticate();
 }
 foreach ($guards as $guard) {
  if ($this->auth->guard($guard)->check()) {
      return $this->auth->shouldUse($guard);
  }
 }
 throw new AuthenticationException('Unauthenticated.', $guards);
}

这将被app / Exceptions / Handler类捕获,该类将调用其render方法,该方法负责将给定异常转换为HTTP响应。

public function render($request, Exception $exception)
{
 return parent::render($request, $exception);
}

App / Exceptions / Handler扩展了&Illuminate \ Foundation \ Exceptions \ Handler',位于' / vendor / laravel / src / Illuminate / Foundation / Exceptions / Handler'内。它有自己的渲染方法。在该渲染方法中,有if else语句表示。

elseif ($e instanceof AuthenticationException)
{
 return $this->unauthenticated($request, $e);
}

以下是上述同一类

中调用的“未经身份验证的”方法
protected function unauthenticated($request, AuthenticationException $exception)
{
  return $request->expectsJson() ? response()->json(['message' => $exception->getMessage()], 401) : redirect()->guest(route('login'));
}

在此方法中,您可以重定向未经身份验证的用户。

据我所见,这是幕后发生的事情。

答案 3 :(得分:0)

然而,你扩展和执行父蟒的方式是正确的 返回视图以执行它只能从路由,控制器操作和过滤器。否则你必须调用send()。

为了您的目的,我认为您之前应该使用过滤器http://laravel.com/docs/4.2/routing#route-filters

相关问题