Laravel 5.3 Перенаправление входа на разные страницы для нескольких пользователей

У меня Laravel 5.3 с тремя разными типами пользователей. Я хочу, чтобы они перенаправлялись на другие страницы панели управления после входа в систему. Например:

пользователь - ›логин -› панель пользователя

админ - ›логин -› админ-панель

Я создал промежуточное ПО под названием CheckRole:

public function handle($request, Closure $next)
{
    if($request->user() === null) {
    return response("Insufficient Permissions" , 401);
    }
    $actions = $request->route()->getAction();
    $roles = isset($actions['roles']) ? $actions['roles'] : null;

    if($request->user()->hasAnyRole($roles) || !$roles) {
            return $next($request);
        }
    return response("Insufficient Permissions" , 401);

}

Маршруты

Route::group(['middleware' => ['auth','roles'], 'roles' => 'Admin'],  function () { 
    // Routes here
}

Роли работают отлично.

Теперь redirectTo= ''; в LoginContoller указывает только на одну точку зрения. Я проверил документацию и считаю, что это как-то связано с охраной, у которой нет объяснений, как ее настроить.

Я также видел мультиаут, но я не думаю, что разумно создавать разные таблицы для разных пользователей и, следовательно, искать альтернативный ответ.

Любое предложение будет оценено по достоинству.

Мои таблицы похожи на:

Table users

id | name | email
---------
1  | John | [email protected]
2  | Michael | [email protected]

Table roles

id | name
---------
1  | Admin
2  | PrivilegedMember
3  | Subscriber

Table user_role

id | user_id | role_id
----------------------
1  |    1    |    1   
2  |    2    |    2

Это может быть дубликат вопроса ниже, но предоставленный ответ остается без объяснения множественных перенаправлений.

Множественная аутентификация в Laravel 5.3


person avinash    schedule 14.10.2016    source источник


Ответы (4)


Реализуйте authenticated() метод в своем LoginController и добавьте туда логику перенаправления:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    // ...

    /**
     * The user has been authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  mixed  $user
     *
     * @return mixed
     */
    protected function authenticated(Request $request, $user)
    {
        if($user->hasRole('Admin')) {
            return redirect()->intended('admin');
        } 

        if ($user->hasRole('PrivilegedMember')) {
            return redirect()->intended('PriviligedMember/index');
        }
    }

    // ...
}

Метод вызывается после аутентификации пользователя. См. Последние две строки sendLoginResponse:

/**
 * Send the response after the user was authenticated.
 *
 * @param  \Illuminate\Http\Request  $request
 *
 * @return \Illuminate\Http\Response
 */
protected function sendLoginResponse(Request $request)
{
    $request->session()->regenerate();

    $this->clearLoginAttempts($request);

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

Так что это идеальный кандидат для такой логики.

Еще одно замечание к вашему собственному ответу, AuthenticatesUser - это черта, которая горизонтально расширяет LoginController, вы можете безопасно переопределить любой из ее методов в своем контроллере, не касаясь основных файлов.

person sepehr    schedule 03.12.2016

Лучший способ (который я нашел) сделать это - использовать < strong> Черты характера. То, что мы собираемся сделать, по сути то же самое, но менее сложное и более структурированное:

1. Вместо создания двух таблиц наша модель пользователя будет иметь поле роли, в моем случае у меня будет: «администратор», «сотрудник» и «пользователь».

2. Мы собираемся создать папку с характеристиками, в этом случае она будет помещена в App/Http.

3. Мы собираемся создать новый файл и называть его RedirectTrait.php внутри этой папки с таким содержанием:

<?php

namespace App\Http\Traits;   // Or the place where the trait is stored (step 2)

use Illuminate\Http\Request;

trait RedirectTrait
{
 /**
 * Where to redirect users after register/login/reset based in roles.
 *
 * @param \Iluminate\Http\Request  $request
 * @param mixed $user
 * @return mixed
 */
public function RedirectBasedInRole(Request $request, $user) {

  $route = '';

  switch ($user->role) {
    # Admin
    case 'admin':
      $route = '/admin/dashboard/route';  // the admin's route
    break;

    # Employee
    case 'employee':
      $route = '/employee/dashboard/route'; // the employee's route
    break;

    # User
    case 'user':
       $route = '/user/dashboard/route';   // the user's route
      break;

      default: break;
    }

    return redirect()->intended($route);
  }

}

Как видите, мы можем «поиграть» с перенаправлениями, но это необходимо в соответствии с документацией laravel:

Предполагаемый метод в перенаправителе будет перенаправлять пользователя на URL-адрес, к которому они пытались получить доступ, прежде чем он будет перехвачен промежуточным программным обеспечением аутентификации. Этому методу может быть предоставлен резервный URI, если предполагаемый пункт назначения недоступен.

4. Наконец, мы разместим черту и назовем ее:

  • В файле App/Http/Controllers/Auth/LoginController.php
 use Illuminate\Http\Request;         // Add 

 use App\Http\Traits\RedirectTrait;   // Call the trait

 class LoginController extends Controller
 {
 ...
 use RedirectTrait;  // Use the trait

/**
 * The user has been authenticated.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  mixed  $user
 * @return mixed
 */
  protected function authenticated(Request $request, $user)
  {
    return $this->RedirectBasedInRole($request, $user);
  }

  ...
  }

Мы перезаписываем "аутентифицированный" метод, помещенный в Illuminate\Foundation\Auth\AuthenticatesUsers (который, кстати, пуст)

  • Мы сделаем то же самое с файлом App/Http/Controllers/Auth/RegisterController.php, но у метода, естественно, будет другое имя:
/**
 * The user has been registered.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  mixed  $user
 * @return mixed
 */
protected function registered(Request $request, $user)
{
    return $this->RedirectBasedInRole($request, $user);
}

Мы перезаписываем «перенаправленный» метод, хранящийся в Illuminate\Foundation\Auth\RegistersUsers, и он тоже пуст.

5. Наслаждайтесь: D

PS. Перенаправление сброса пароля - это уже другая история.

person Yefferson Marín    schedule 08.12.2016

Похоже, что приведенное ниже решение отменяет процесс и выполняет свою работу. Но я не думаю, что это правильный путь, поскольку мы возимся с файлами Core. Кто-нибудь, пожалуйста, пролейте свет на это.

Перейдите в типаж AuthenticatesUser.php.

найдите SendLoginResponse (Request $ request)

Перед возвратом пути по умолчанию добавьте свои условия.Я изменил его на ниже

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

    $this->clearLoginAttempts($request);



    if(Auth::User()->hasRole('Admin')) {
        return redirect()->intended('admin');
    } elseif (Auth::User()->hasRole('PrivilegedMember')) {
        return redirect()->intended('PriviligedMember/index');
    }

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

LoginController.php

  protected function authenticated(Request $request, $user)
    {
        if($user->id_role == 1) {
            return redirect()->intended('/admin');
        } 

        if ($user->id_role != 1) {
            return redirect()->intended('/user');
        }
    }
person Ardhika Rafi    schedule 11.08.2020