Php 如果用户未通过身份验证,如何重定向到登录
我试图使用扩展类(Php 如果用户未通过身份验证,如何重定向到登录,php,laravel,authentication,laravel-5,laravel-5.1,Php,Laravel,Authentication,Laravel 5,Laravel 5.1,我试图使用扩展类(AdminControllerextendsAdminBaseController)中的\uu构造函数),但实际上它不起作用,我不知道可以使用什么,在这里您可以看到我的两个类: AdminBaseController.php class AdminBaseController extends Controller { public function __construct(){ if (!Auth::user()){ return
AdminController
extendsAdminBaseController
)中的\uu构造函数
),但实际上它不起作用,我不知道可以使用什么,在这里您可以看到我的两个类:
AdminBaseController.php
class AdminBaseController extends Controller
{
public function __construct(){
if (!Auth::user()){
return view('admin.pages.login.index');
}
}
}
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');
}
}
AdminController.php
class AdminBaseController extends Controller
{
public function __construct(){
if (!Auth::user()){
return view('admin.pages.login.index');
}
}
}
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');
});
为此目的使用中间件,然后在控制器构造函数中使用它,如下例所示
public function __construct()
{
$this->middleware('guest', ['except' => 'logout']);
}
然后,您需要保护从用户登录到访问的路由
Route::group(['middleware' => 'auth'], function() {
Route::get('/dashboard', 'DashboardController@index');
});
但是,扩展和执行父收缩器的方式是正确的 仅可通过路由、控制器操作和筛选器返回视图以执行它。否则,必须调用send()
出于您的目的,我认为您应该使用Prefore for filter控制器不是检查用户是否经过身份验证的正确位置。您应该为此使用中间件。要获取关于什么是中间件的信息,请检查 让我们看看如何使用默认的Laravel的
auth
中间件实现此目的:
首先,摆脱你的AdminBaseController
,只使用AdminController
然后,您必须检查文件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');
});
在Laravel 5.5中,未经身份验证的用户将导致身份验证中间件抛出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扩展了“illumb\Foundation\Exceptions\Handler”,位于“/vendor/laravel/src/illumb/Foundation/Exceptions/Handler”内。它有自己的渲染方法。在这个render方法中,有一个if-else
语句,它说
elseif ($e instanceof AuthenticationException)
{
return $this->unauthenticated($request, $e);
}
下面是上面在同一类中调用的“unauthenticated”方法
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson() ? response()->json(['message' => $exception->getMessage()], 401) : redirect()->guest(route('login'));
}
在此方法中,可以重定向未经身份验证的用户
就我所见,这就是幕后发生的事情。在AdminController::construct()中不做任何事情,因此可以避免编写它,类将使用其父构造函数。从这个问题来看,还不清楚:问题出在哪里?@Moppo我有很多用于管理区域的控制器,为了避免代码重复,我在验证用户是否使用AdminBaseController
ok中的uu构造函数进行了身份验证。你应该使用一个中间件来检查用户是否是管理员我已经发布了一个答案,解释了如何使用middlewareYeah,因为Denis saide中间件也是Laravel5中等待的最佳选择我完全不了解php/laravel,我自己也从未使用过中间件,查看这些文件,我可以看到一个名为Authenticate
的中间件,它里面有一个名为handle
的函数,我可以使用它吗?发现了一个小问题,在我提交表单时实现了这个功能,然后重新刷新页面…问题是:postLogin也进入了中间件内部,因为它在admin组中,我编辑我的答案以向您展示我的路线我已经解决了从admin
路线中删除admin/login
路线的问题,这是正确的方法吗?确切地说:postLogin应该在authenticated routes组之外,因为用户在提交表单时仍然没有进行身份验证