Multi Auth Laravel 5.4 с использованием только двух промежуточных программ

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

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

RedirectIfAuthenticated.php

<?php

 class RedirectIfAuthenticated
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @param  string|null  $guard
 * @return mixed
 */
public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
        if (Auth::user()->role_id == 1)
        {
            return redirect('/admin/home');
        }
        return redirect('/dashboard');
    }

    return $next($request);
}
}

DashboardController.php

class DashboardController extends Controller
{

/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    return view('authFront.layoutAuthenticatedUser.dashboard');
}


}

веб.php

    Route::get('/us-admin', function () { return redirect('/admin/home');    })->name('admin.dashboard');

   // Authentication Routes...
   $this->get('login',    'Auth\LoginController@showLoginForm')->name('auth.login');
    $this->post('login', 'Auth\LoginController@login')->name('auth.login');
   $this->post('register', 'Auth\RegisterController@register')->name('auth.register');

   $this->post('logout', 'Auth\LoginController@logout')->name('auth.logout');


   // Change Password Routes...
   $this->get('change_password',   'Auth\ChangePasswordController@showChangePasswordForm')->name('auth.change_password');
   $this->patch('change_password', 'Auth\ChangePasswordController@changePassword')->name('auth.change_password');

   // Password Reset Routes...
   $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('auth.password.reset');
   $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('auth.password.reset');
  $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
  $this->post('password/reset', 'Auth\ResetPasswordController@reset')->name('auth.password.reset');

   Route::group(['middleware' => ['auth'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
    Route::get('/home', 'HomeController@index');

});
   Route::get('/dashboard', 'DashboardController@index');

person Yassine Mabrouk    schedule 16.06.2017    source источник
comment
Называя своих пользователей простыми, вы не приобретете друзей :) А если серьезно, что у вас есть, кроме хорошей идеи? Где ты застрял? С какими проблемами вы сталкиваетесь?   -  person Dale    schedule 16.06.2017
comment
спасибо @Dale, у меня уже есть бэк-офис для администраторов, теперь я хочу, чтобы, если пользователь хочет пройти аутентификацию через переднюю часть моего веб-сайта, он будет перенаправлен в небольшой бэк-офис с профилем и другими элементами, которые мне не нужны. Что пользователь получает доступ к бэк-офису администраторов.   -  person Yassine Mabrouk    schedule 16.06.2017
comment
просто создайте столбец для хранения роли пользователя (администратор, суперадминистратор, пользователь)   -  person Felix    schedule 16.06.2017
comment
@HoàngĐăng Уже сделано, проблема в том, что тест промежуточного программного обеспечения не работает.   -  person Yassine Mabrouk    schedule 16.06.2017


Ответы (2)


В этом случае вам необходимо установить роли пользователей или иметь необязательное логическое поле в таблице пользователей для is_admin. Тогда в промежуточном программном обеспечении это будет просто что-то вроде:

class RedirectIfNotAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (!Auth::user()->admin()) {
            return redirect()->to('user-dashboard');
        }
        return $next($request);
    }
}

Так что в вашем случае я бы создал отдельное промежуточное ПО для каждой пост-авторизации роли. Затем вы примените AdminMiddleware ко всем маршрутам с префиксом «admin», а SimpleUserMiddleware, например, ко всем другим маршрутам.

person Community    schedule 16.06.2017
comment
Я уже установил управление ролями, с внешним ключом в таблице пользователей с полем role_id, но я уже пытался создать промежуточное программное обеспечение, которое для простых пользователей, но оно не работает. - person Yassine Mabrouk; 16.06.2017
comment
но как ?! не могли бы вы помочь, пожалуйста - person Yassine Mabrouk; 16.06.2017

Вы можете просто проверить роли в промежуточном программном обеспечении RedirectIfAuthenticated, которые уже существуют по умолчанию, и ограничить маршруты, создав промежуточное программное обеспечение администратора.

In app/Http/Middleware/RedirectIfAuthenticated.php

<?php

namespace App\Http\Middleware;

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

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            if (Auth::user()->role_id == 1)
            {
                return redirect('/admin/home');    
            }
            return redirect('/dashboard');
        }

        return $next($request);
    }
}

In app/Http/Middleware/AuthenticateAdmin.php

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class AuthenticateAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!Auth::check() || Auth::user()->role_id != 1)
        {
            if ($request->ajax())
            {
                return response('Unauthorized.', 401);
            }
            else
            {
                return redirect()->guest('login');
            }
        }
        return $next($request);
    }
}

В app/Http/Kernal.php добавьте эту строку в массив $routeMiddleware

'admin' => \App\Http\Middleware\AuthenticateAdmin::class,

In routes/web.php

Route::middleware('admin')->prefix('admin')->group(function() {
    Route::get('/home', 'HomeController@index')->name('admin.home');
});

В app/Http/Controllers/Auth/LoginController.php добавить эту функцию

protected function authenticated(Request $request, $user)
{
    if ($user->role_id == 1) {
        return redirect()->intended(route('admin.home'));
    }
    return redirect()->intended(route('dashboard'));
}   

Надеюсь, это поможет вам

person Adeeb basheer    schedule 16.06.2017
comment
Будьте осторожны с этим, он перенаправит вас обратно на домашнюю страницу ролей с внутренних страниц, если вы примените его ко всем маршрутам в группе. - person ; 16.06.2017
comment
это не промежуточное ПО, которое вы используете для применения к каждому маршруту, это промежуточное ПО по умолчанию, которое проверяет, когда вы аутентифицированы. Чтобы подать заявку на все маршруты, вам нужно создать еще одно простое промежуточное ПО для администрирования. - person Adeeb basheer; 16.06.2017
comment
он перенаправляет меня на не найденную страницу - person Yassine Mabrouk; 16.06.2017
comment
/home и /admin/home в этом примере просто заполнители, вам нужно будет настроить для них маршруты. - person ; 16.06.2017
comment
я знаю, я устанавливаю свои собственные маршруты, но это не работает, я думаю, что он не проверяет role_id - person Yassine Mabrouk; 16.06.2017
comment
пожалуйста, обновите свой вопрос с вашим кодом, чтобы мы могли исправить, если это необходимо - person Adeeb basheer; 16.06.2017
comment
тебе это помогло? - person Adeeb basheer; 17.06.2017
comment
@Adeebbasheer, это не работает, оно перенаправляет администратора и улыбается на тот же путь / панель инструментов и показывает ошибку 404. Страница не найдена. - person Yassine Mabrouk; 18.06.2017
comment
@YassineMabrouk Если я получу доступ, я смогу заставить его работать на вас - person Adeeb basheer; 19.06.2017
comment
мне просто нужно знать структуру, вызываете ли вы правильный взгляд и т. д. - person Adeeb basheer; 19.06.2017
comment
@Adeebbasheer дай мне свой адрес электронной почты - person Yassine Mabrouk; 19.06.2017