Nano Hash - криптовалюты, майнинг, программирование

Пользовательское ведение журнала и маршрутизация защиты с несколькими аутентификациями

Я разрабатываю приложение Laravel 6 с 4 разными пользователями (с разными таблицами для каждого). Для этого я использую multi auth guard и создал свою первую защиту, следуя этому онлайн-руководству (https://pusher.com/tutorials/multiple-authentication-guards-laravel).

Вот мой персонализированный охранник "ученик"

    'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
    'student' => [
        'driver' => 'session',
        'provider' => 'students',
    ],
],

И провайдеры

    'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'students' => [
        'driver' => 'eloquent',
        'model' => App\Models\Student::class,
    ],
],

У меня есть настраиваемый контроллер входа в систему, использующий настраиваемую защиту аутентификации с именем «студент»

namespace App\Http\Controllers;

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

class LoginController extends Controller
{
    protected $redirectTo = '/dashboard';

    public function __construct()
    {
        $this->middleware('guest')->except('destroy');
        $this->middleware('student')->except('destroy');
    }
    public function studentLogin(Request $request)
    {
        $this->validate($request, [
            'email'   => 'required|email',
            'password' => 'required|min:5'
        ]);

        if (Auth::guard('student')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))) {

            return redirect()->intended('admin/home')->with('smessage', 'Logged in successfully...!');
        }
        return back()->withInput($request->only('email', 'remember'));
    }...
    }

Теперь, всякий раз, когда я пытаюсь войти в систему, кажется, что я вхожу в систему и перенаправляюсь на URL-адрес, определенный в промежуточном программном обеспечении / RedirectIfAuthenticated.php, но эта ошибка выскакивает «Попытка получить свойство не-объекта», которое из общего заголовка шаблон, в котором на auth()->user() отсутствуют данные зарегистрированного пользователя.

Если я использую 'middleware'=>'auth:student', я могу получить доступ к маршруту как студент и иметь зарегистрированные пользовательские данные через auth()->user(). то же самое для администратора, использующего 'middleware'=>'auth', но передавая как auth, так и auth:student в виде массива, я не могу получить зарегистрированные данные пользователя через auth()->user() для обоих пользователей.

Вот мои маршруты:

Route::get('/', function () {
    return view('welcome');
});
Route::get('/login', 'LoginController@create')->name('login');
Route::post('login', 'LoginController@store');
Route::get('/login/student', 'LoginController@create')->name('studentlogin');
Route::post('/login/student', 'LoginController@studentLogin');

Route::get('/logout', 'LoginController@destroy')->name('logout'); 

Route::group(['prefix'=>'admin', 'namespace' => 'Dashboard', 'middleware'=> 'auth' ], function () {

    Route::get('home', 'DashboardController@display')->name('admin.home');

    Route::get('users', 'UserlistController@display')->name('admin.userlist');
    Route::post('users', 'UserlistController@store')->name('admin.create');
    Route::delete('users/{id}', 'UserlistController@destroy')->name('admin.deleteuser');

});

Route::group(['prefix'=>'student', 'namespace' => 'Students', 'middleware'=> 'auth:student' ], function () {
    Route::get('all', 'StudentsController@display')->name('student.all');
    Route::delete('all/{id}', 'StudentsController@destroy')->name('student.delete');
    Route::post('all', 'StudentsController@store')->name('student.store');
});

Не удалось найти решения из других связанных тем на StackOverflow. Пожалуйста, исправьте меня, если у меня где-то есть ошибки, или дайте мне знать, если вы хотите проверить какие-либо другие файлы на предмет кода.

Заранее спасибо.


  • попробуйте видеоурок youtube.com/ 30.12.2019
  • Не могли бы вы опубликовать полное определение маршрута для маршрута, к которому вы пытаетесь получить доступ после аутентификации? Также обратите внимание, что вы перенаправляете пользователей, которые входят в систему как студент, на admin/home, а не на маршрут, определенный в RedirectIfAuthenticated промежуточном программном обеспечении. 30.12.2019
  • @arun Я тоже просмотрел упомянутое видео, думаю, я уже рассмотрел все упомянутые шаги. 31.12.2019
  • @ matteo-meil, хотя для перенаправления установлено значение «admin / home» из loginController, я все еще перенаправлен на то, что я определил в redirectIfAutnenticated.php, то есть student / all. Есть ли ошибки? P.S. Я также добавил свое определение маршрута к вопросу 31.12.2019

Ответы:


1

У вас нет данных о auth()->user(), потому что вы запрашиваете защиту по умолчанию, которая равна web.

Если вы хотите получить зарегистрированного пользователя через student guard, вам нужно сделать auth()->guard('student')->user();

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

То есть: если вам нужно сделать некоторые маршруты ограниченными только для аутентифицированных пользователей, вам нужно будет сделать:

Route::group(['middleware' => 'auth:student'], function() {
    // Your restricted routes
})

Если вы не укажете :student, будет использоваться защита по умолчанию web, как всегда.

Обратите внимание, что если вам нужно ограничить свои маршруты для группы пользователей, принадлежащих разным охранникам, вы можете передать этих охранников auth:

Route::group(['middleware' => 'auth:web,student'], function() {
    // Your restricted routes
}];

Таким образом, Laravel проверит и web, и student охранников и автоматически установит тот, который принадлежит аутентифицированному пользователю. Вы также сможете получить своего пользователя, только выполнив auth()->user(), забыв пройти правую охрану.

31.12.2019
  • Хорошо, я добавил промежуточное ПО ['middleware' = ›'auth: student'] для группы маршрута student. Всякий раз, когда я применяю это промежуточное ПО, оно работает для этого маршрута, т.е. я получаю данные зарегистрированного пользователя как для auth () - ›user (), так и для auth () -› guard ('student') - ›user (); на студенческих маршрутах Отлично! Но почему я не могу получить доступ к маршрутам или группе маршрутов, где я не применил какое-либо промежуточное ПО (потому что это общедоступные страницы, к которым может получить доступ любой пользователь)? 31.12.2019
  • Из-за 'middleware'=> 'auth' в определении маршрутов (проверьте определение маршрутов). Как я написал в своем ответе, для этих маршрутов будет использоваться web гвардия по умолчанию. Если вы не укажете промежуточное программное обеспечение, у вас не будет проблем с доступом к этому маршруту, но если вы назначите неправильный, вы не сможете получить к нему доступ. 31.12.2019
  • Спасибо за разъяснение, но: 1. Я не получаю данные зарегистрированного пользователя через auth()->user() на маршрутах без определенного промежуточного программного обеспечения 2. Я попытался добавить 'middleware'=> ['auth', 'auth:student'], но даже не могу получить доступ к маршруту как от администратора, так и от пользователя-студента. Я снова что-то не так делаю? 01.01.2020
  • В маршрутах без промежуточного программного обеспечения вы должны использовать auth()->guard('student')->user(), как я написал в ответе. В маршрутах с middleware'=> ['auth', 'auth:student'] нужно удалить auth и оставить только auth:student. Обратите внимание, что промежуточное ПО выполняется в том порядке, в котором вы их пишете. Вам следует внимательно прочитать документацию по промежуточному программному обеспечению. 01.01.2020
  • Будет несколько других пользователей и их промежуточного программного обеспечения, использующих тот же шаблон, в котором будет использоваться auth()->user(), поэтому я не могу просто использовать auth()->guard('student')->user(). То же самое с промежуточным программным обеспечением в маршрутах, использование только auth:student разрешит доступ только студентам, в то время как я хочу, чтобы к нему могли обращаться несколько пользователей или все пользователи в некоторых случаях. Как лучше всего это сделать? 02.01.2020
  • Что касается промежуточного программного обеспечения, вы можете передать список охранников следующим образом: auth:web,student,other_guard, чтобы сделать маршрут доступным для аутентифицированных пользователей от всех этих охранников. Затем внутри вашего маршрута вы можете легко получить доступ к вашему аутентифицированному пользователю через auth()->user(), потому что Laravel под капотами проверяет все указанные средства защиты, а затем устанавливает глобально правильный, используя метод shouldUse($guard). Взгляните на Illuminate\Auth\Middleware\Authenticate@authenticate, чтобы понять, что делает Laravel 02.01.2020
  • Ой! Вы имеете в виду, что я могу передать список охранников таким образом 'middleware'=> ['auth:web,student'], чтобы я мог получить доступ к маршруту от пользователей, которые принадлежат как к веб-стражам, так и к студенческой охране. Идеально! Можете ли вы также обновить свой основной ответ, добавив в него возможности добавления нескольких охранников в промежуточное ПО, чтобы я мог отметить ваш ответ как наиболее полезный? Спасибо! 03.01.2020
  • Отредактировал свой ответ, проверьте сейчас 03.01.2020
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..