суббота, 9 сентября 2017 г.

Laravel. Блог. Аутентификация для админа. Перенаправление

Залогинимся через http://blog.my/admin-login


Но даже залгоившись мы видим страницу http://blog.my/admin-login
Что бы это исправить поменяем в методе construct middleware

Зайдем в \app\Http\Controllers\Admin\Auth\LoginController.php
public function __construct()
{
$this->middleware('guest:admin')->except('logout');
}

Теперь нас перебрасывает на страницу входа для пользователя http://blog.my/login

Откроем файл \app\Http\Middleware\RedirectIfAuthenticated.php

<?php

namespace App\Http\Middleware;

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

class RedirectIfAuthenticated
{
public function handle($request, Closure $next, $guard = null)
{

switch($guard) {
case 'admin':
if(Auth::guard($guard)->check()) {
return redirect('admin/home');
}
break;

default:

if (Auth::guard($guard)->check()) {
return redirect('/home');
}


}

return $next($request);
}
}

Если мы залогинины и мы наберем http://blog.my/admin-login
то нас перебросит на http://blog.my/admin/home

Теперь разлогинимся и наберем http://blog.my/admin/home и мы попадем на эту страницу.

Идем в контроллер \app\Http\Controllers\HomeController.php
Скопируем конструктор:
public function __construct()
{
$this->middleware('auth');
}
И вставим в файл \app\Http\Controllers\Admin\HomeController.php
Но перепишем немного:
public function __construct()
{
$this->middleware('auth:admin');
}
Теперь разлогинимся и наберем http://blog.my/admin/home и мы попадем на страницу логина для пользователей: http://blog.my/login
Но мы хотим, чтобы нас перебрасывало на страницу для залогинивания админа.

Вставим этот __construct() во все контроллеры, которые находятся в папке Admin.

В \routes\web.php укажем middleware, чтобы нельзя было войти на страницы админки незалогиненными.
Route::group(['namespace' => 'Admin', 'middleware'=>'auth:admin'], function() {
Route::get('admin/home', 'HomeController@index')->name('admin.home');
Route::resource('admin/user', 'UserController');
Route::resource('admin/post', 'PostController');
Route::resource('admin/tag', 'TagController');
Route::resource('admin/category', 'CategoryController');

// Аутентификация
Route::get('admin-login', 'Auth\LoginController@showLoginForm')->name('admin.login');
Route::post('admin-login', 'Auth\LoginController@login');
});

Прежде middleware из маршрутов
Route::group(['namespace' => 'Admin'], function() {
Route::get('admin/home', 'HomeController@index')->name('admin.home');
Route::resource('admin/user', 'UserController');
Route::resource('admin/post', 'PostController');
Route::resource('admin/tag', 'TagController');
Route::resource('admin/category', 'CategoryController');

// Аутентификация
Route::get('admin-login', 'Auth\LoginController@showLoginForm')->name('admin.login');
Route::post('admin-login', 'Auth\LoginController@login');
});

Идем в \app\Exceptions\Handler.php
<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
/**
* A list of the exception types that should not be reported.
*
* @var array
*/
protected $dontReport = [
\Illuminate\Auth\AuthenticationException::class,
\Illuminate\Auth\Access\AuthorizationException::class,
\Symfony\Component\HttpKernel\Exception\HttpException::class,
\Illuminate\Database\Eloquent\ModelNotFoundException::class,
\Illuminate\Session\TokenMismatchException::class,
\Illuminate\Validation\ValidationException::class,
];

/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $exception
* @return void
*/
public function report(Exception $exception)
{
parent::report($exception);
}

/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}

/**
* Convert an authentication exception into an unauthenticated response.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Auth\AuthenticationException $exception
* @return \Illuminate\Http\Response
*/
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}

$guard = array_get($exception->guards(),0);

switch ($guard) {
case 'admin':
return redirect()->guest(route('admin.login'));
break;

default:
return redirect()->guest(route('login'));
break;
}

}
}



2 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. Спасибо за Вашу публикацию! Пару дней искал как самому написать админку, и вот только здесь
    нашел то что нужно. Будьте добры ответьте на вопрос. Как только в роуте прописываю: 'middleware'=>'auth:admin' страницы админки подвисают. Подскажите в чем может быть дело?

    ОтветитьУдалить

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html