Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 10.10.2016 11:35:49

FrozenRain

Редирект при авторизации

Проблема такова, если удалить сессию, и зайти в админ зону кидает на /login,  и сделать иной ридерект не представляется возможным.
далее  следует версия ларавел 5.3 (тоже самое и на 5.2)
вот код:

class AdminLocController extends Controller
{

    protected $redirectPath = '/abc';
    public function Index()
    {
        return "Hello Admin!";
    }
}
class AuthController extends Controller
{
    protected $redirectPath = 'auth/querty';
    protected $redirectTo = 'auth/asdfg';
    protected $loginPath = 'auth/zxcvb';

    protected $redirectAfterLogout = 'auth/poiuy';

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

    public function GetLogin()
    {
        return view('auth/login');
    }


    public function postLogin(Request $request)
    {
        Auth::logout();
        $v = $this->RuleLogin($request->all());
        if($v->fails())
        {
            return redirect()->back();
        }
        if(Auth::attempt(['login' => $request->input('login'), 'password' => $request->input('password')], true))
        {
            $key = auth()->getRecallerName();
            Cookie::queue($key, Cookie::get($key), 60);
            return redirect()->intended('/adminzone');
        }
        return redirect()->back();
    }

    public function Logout()
    {
        Auth::logout();
    }

    protected function RuleLogin(array $data)
    {
        return Validator::make($data, ['login' =>'required|alpha_num|between:2,12','password'=>'required|alpha_num|between:2,12',]);
    }
}
Route::group(['prefix' => 'adminzone', 'middleware' => 'auth:web'], function(){

    Route::get('/', 'AdminLocController@Index');
});
Route::get('/auth/logout', 'Auth\AuthController@Logout');
Route::get('/auth/login', 'Auth\AuthController@getLogin');
Route::post('/auth/login', 'Auth\AuthController@postLogin');
Route::get('/a/{login}/{password}', 'DocumentationController@GetAllModules');
Route::get('/h', 'DocumentationController@Index');
Route::get('/', function () {
    return view('welcome');
});

Вредный кусок кода порождающий проблему:

<?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);
        }

        return redirect()->guest('login');
    }
}

#2 11.10.2016 03:49:33

Re: Редирект при авторизации

1) Не понятно что ты хочешь сделать.

2) "Вредный кусок" находится в файле который никто не мешает тебе отредактировать.

Не в сети

#3 11.10.2016 07:13:16

FrozenRain

Re: Редирект при авторизации

1 хочу редирект на другой урл.
2 мишает мне его отредактировать laravel.
Ибо завтра грядет laravel 6, или что то там. А вместо красивой composer update, будет поход за средством от гемороя.

#4 12.10.2016 15:17:24

FrozenRain

Re: Редирект при авторизации

Ребята вопрос еще актуален. Неужели не кто не сталкивался с этой проблемой ???

#5 12.10.2016 16:18:02

Re: Редирект при авторизации

заткни /home роутом с перманентным редиректом.
и не трогай ничего, если не хочешь лечиться от гемора.

Изменено hzone (12.10.2016 16:20:12)

Не в сети

#6 12.10.2016 17:01:32

FrozenRain

Re: Редирект при авторизации

Не понял тебя.

#7 24.10.2016 15:26:06

Re: Редирект при авторизации

FrozenRain, удалось ли победить проблему красиво?

Меня вот еще мучает вопрос, а как-то можно редиректить в зависимости от роли? Админов в админку, пользователей на сайт.

Не в сети

#8 24.10.2016 16:53:23

Re: Редирект при авторизации

kamwork пишет:

Меня вот еще мучает вопрос, а как-то можно редиректить в зависимости от роли? Админов в админку, пользователей на сайт.

В 5.3 переопредели в контроллере Auth\LoginController.php, метод sendLoginResponse(). Скопируй оригинальный метод, но в конец измени на что-то вроде:

return redirect(auth()->user()->isAdmin() ? 'admin' : '/');

Не в сети

#9 25.10.2016 13:23:48

Re: Редирект при авторизации

AlexeyMezenin пишет:
kamwork пишет:

Меня вот еще мучает вопрос, а как-то можно редиректить в зависимости от роли? Админов в админку, пользователей на сайт.

В 5.3 переопредели в контроллере Auth\LoginController.php, метод sendLoginResponse(). Скопируй оригинальный метод, но в конец измени на что-то вроде:

return redirect(auth()->user()->isAdmin() ? 'admin' : '/');

Спасибо! Сделал без переноса всего метода, все работает.

Добавил в LoginController.php, не перенося весь метод:

protected function sendLoginResponse() 
{
        return redirect(auth()->user()->hasRole(['superadministrator', 'administrator', 'partner']) ? '/admin' : '/');
    }

Работает, но не уверен, что верно сделал, исходный класс выглядит так:

  protected function sendLoginResponse(Request $request)
    {
        $request->session()->regenerate();

        $this->clearLoginAttempts($request);

        return $this->authenticated($request, $this->guard()->user())
                ?: redirect()->intended($this->redirectPath());
    }

Стоит ли переносить ?

$request->session()->regenerate();

$this->clearLoginAttempts($request);

И не должен ли return выглядеть:

 return $this->authenticated($request, $this->guard()->user()->hasRole(['superadministrator', 'administrator', 'partner']))
                 ? '/admin' : '/');

Изменено kamwork (25.10.2016 13:24:07)

Не в сети

Подвал раздела