Я разрабатываю приложение 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. Пожалуйста, исправьте меня, если у меня где-то есть ошибки, или дайте мне знать, если вы хотите проверить какие-либо другие файлы на предмет кода.
Заранее спасибо.
'middleware'=> 'auth'
в определении маршрутов (проверьте определение маршрутов). Как я написал в своем ответе, для этих маршрутов будет использоватьсяweb
гвардия по умолчанию. Если вы не укажете промежуточное программное обеспечение, у вас не будет проблем с доступом к этому маршруту, но если вы назначите неправильный, вы не сможете получить к нему доступ. 31.12.2019auth()->user()
на маршрутах без определенного промежуточного программного обеспечения 2. Я попытался добавить'middleware'=> ['auth', 'auth:student']
, но даже не могу получить доступ к маршруту как от администратора, так и от пользователя-студента. Я снова что-то не так делаю? 01.01.2020auth()->guard('student')->user()
, как я написал в ответе. В маршрутах сmiddleware'=> ['auth', 'auth:student']
нужно удалитьauth
и оставить толькоauth:student
. Обратите внимание, что промежуточное ПО выполняется в том порядке, в котором вы их пишете. Вам следует внимательно прочитать документацию по промежуточному программному обеспечению. 01.01.2020auth()->user()
, поэтому я не могу просто использоватьauth()->guard('student')->user()
. То же самое с промежуточным программным обеспечением в маршрутах, использование толькоauth:student
разрешит доступ только студентам, в то время как я хочу, чтобы к нему могли обращаться несколько пользователей или все пользователи в некоторых случаях. Как лучше всего это сделать? 02.01.2020auth: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