#laravel #eloquent #controller #guard #laravel-middleware
#laravel #красноречивый #контроллер #защита #laravel-промежуточное программное обеспечение
Вопрос:
Я определяю нового охранника «Admin», чтобы в моем проекте был системный пользователь с несколькими правами доступа и администратор. web guard разрешает вход в систему.Но admin guard не разрешает вход в систему, когда я пытаюсь войти в Admin, он выдает
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'last_sign_in_at' in 'field list' (SQL: update `admins` set `updated_at` = 2020-09-27 12:49:24, `last_sign_in_at` = 2020-09-27 12:49:24, `current_sign_in_at` = 2020-09-27 12:49:24 where `id` = 1)
Моя таблица пользователей
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('user_type');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->boolean('status')->default(0);
$table->timestamp('last_sign_in_at')->nullable();
$table->timestamp('current_sign_in_at')->nullable();
$table->string('user_click');
$table->timestamp('user_click_time')->nullable();
$table->rememberToken();
$table->timestamps();
});
}
Моя таблица администратора
public function up()
{
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('user_type');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->boolean('status');
$table->rememberToken();
$table->timestamps();
});
}
auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
//admin guard
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => AppUser::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => AppAdmin::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
'admins' => [
'provider' => 'admins',
'table' => 'password_resets',
'expire' => 60,
],
],
Моя контрольная роль промежуточного программного обеспечения
public function handle($request, Closure $next)
{
if (!Auth::guard('admin')->check()){
return redirect('admin/login');
}
return $next($request);
}
Мой Admin.php Модель
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
//guard
use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
//guard End
class Admin extends Authenticatable
{
use Notifiable;
protected $guard ='admin';
protected $hidden = [
'password', 'remember_token',
];
protected $guarded=[];
protected $casts = [
'email_verified_at' => 'datetime',
];
}
Мой AdminController
public function adminLogin(Request $request){
if ($request->ismethod('post')) {
$data = $request->input();
if ( Auth::guard('admin')->attempt(['email' => $data['email'], 'password' => $data['password'],
'user_type'=>'admin', 'status' => '1'])){
return view('admin.dashboard');
}
else {
return back()->with('error',' Invalid UserName Or Password');
}
}
}
Когда я попытался войти в Admin, он выдает ошибку. Любое решение ps!
Ответ №1:
Похоже, у вас есть прослушиватель событий, который прослушивает LoginEvent Auth, и он устанавливает last_sign_in_at
поле в модели и сохраняет его. Поскольку вы используете разные модели для аутентификации, в конечном итоге вы попытаетесь сделать это на любой модели в этом случае; в данном случае модель администратора.
Вам нужно будет добавить это поле в вашу таблицу администратора, или вам нужно будет проверить в прослушивателе, какую модель проводит событие, и решить, следует ли обновлять это поле в зависимости от типа этой модели.
Комментарии:
1. Если я удалю слушателей, все будет в порядке?
2. итак, вы спрашиваете: «Если проблема вызвана прослушивателем, если я его удалю, это больше не вызовет проблемы, которую оно вызывает?» 🙂
3. вы даже пробовали то, что просили?