аутентификация laravel с красноречивым драйвером по ролям

Я пытаюсь аутентифицировать пользователей в своем приложении Laravel.

Я столкнулся со следующей проблемой:

  • используя базу данных драйверов в auth.php: я могу войти с использованием auth :: try (), а auth :: check работает, но я не могу проверить, имеет ли зарегистрированный пользователь определенную роль.
  • используя драйвер eloquent в auth.php: я могу войти с помощью auth :: попытка (), но auth :: check не работает. Однако я могу проверить роль зарегистрированного пользователя.

edit (question): Как я могу исправить это, чтобы только с одним из драйверов я могу выполнить полную проверку подлинности и проверки роли?

Таблицы миграции:

Schema::create('users', function ($table) { $table->increments('id'); $table->integer('group_id')->unsigned(); $table->string('name', 64); $table->string('email', 64)->unique(); $table->string('username', 64)->unique(); $table->string('phone', 13); $table->string('address', 64); $table->boolean('isresponsible'); $table->string('password', 64); $table->rememberToken()->nullable(); }); Schema::create('roles', function ($table) { $table->increments('id'); $table->string('name'); }); Schema::create('users_roles', function ($table) { $table->integer('user_id')->unsigned(); $table->integer('role_id')->unsigned(); } ); Schema::table('users_roles', function($table){ $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->foreign('role_id')->references('id')->on('roles'); }); 

Модельный класс Пользователь

 <?php use Illuminate\Auth\UserTrait;` use Illuminate\Auth\UserInterface;` use Illuminate\Auth\Reminders\RemindableTrait; use Illuminate\Auth\Reminders\RemindableInterface; class User extends Eloquent implements UserInterface, RemindableInterface { use UserTrait, RemindableTrait; /** * The database table used by the model. * * @var string */ protected $table = 'users'; public $timestamps = false; public static $rules = ['name' => 'required', 'group_id' => 'required', 'email' => 'required', 'phone' => 'required']; protected $fillable = ['name', 'group_id', 'email', 'phone', 'address', 'isresponsible', 'password']; /** * The attributes excluded from the model's JSON form. * * @var array */ protected $hidden = array('password', 'remember_token'); public function group() { return $this->belongsTo('Group'); } public function userroles(){ return $this->hasMany('Userrole'); } public function roles() { return $this->belongsToMany('Role', 'users_roles'); } public function hasRole($check) { dd($this->roles->toArray()); return in_array($check, array_fetch($this->roles->toArray(), 'name')); } public function setBasicPassword($id){ $user = User::find($id); $user->password = Hash::make('changeme'); $user->save(); } public function isValid() { $validation = Validator::make($this->attributes, static::$rules); if ($validation->passes()) return true; $this->messages = $validation->messages(); return false; } /** * Get the e-mail address where password reminders are sent. * * @return string */ public function getReminderEmail() { // TODO: Implement getReminderEmail() method. } /** * Get the unique identifier for the user. * * @return mixed */ public function getAuthIdentifier() { return $this->email; } /** * Get the password for the user. * * @return string */ public function getAuthPassword() { return $this->password; } /** * Get the token value for the "remember me" session. * * @return string */ public function getRememberToken() { return $this->remember_token; } public function setRememberToken($value) { $this->remember_token = $value; } public function getRememberTokenName() { return 'remember_token'; } } 

модель Роль класса

 class Role extends Eloquent { protected $table = 'roles'; public $timestamps = false; public static $rules = ['role_id' => 'required', 'name' => 'required']; protected $fillable = ['name']; /** * Get users with a certain role */ public function userroles() { return $this->belongsToMany('User', 'users_roles'); } } 

Функция аутентификации HomeController

  public function authenticate(){ $rules = array( 'email' => 'required|email', 'password' => 'required|alphaNum|min:3' ); $validator = Validator::make(Input::all(), $rules); if ($validator->fails()) { return Redirect::to('login') ->withErrors($validator) ->withInput(Input::except('password')); } else { $userdata = array( 'email' => Input::get('email'), 'password' => Input::get('password') ); if (Auth::attempt($userdata, true)) { return Redirect::action('HomeController@index'); } else { return Redirect::action('HomeController@login')->withInput(); } } } 

ИСПОЛЬЗОВАНИЕ ДРАЙВЕРА ДАННЫХ
– работают auth: попытка () и auth :: check

 $this->beforeFilter('admin', ['only' => ['index']]); //filter in controller //filter in filters;php Route::filter('admin', function() { if(!Auth::check()) return Redirect::action('HomeController@index'); if(!Auth::user()->hasRole('admin')) return View::make('errors.401'); }); 

Это не выполняется с помощью «Вызов неопределенного метода Illuminate \ Auth \ GenericUser :: hasRole ()»

EDIT Драйвер базы данных возвращает объект GenericUser, и мне нужен мой собственный объект User. Не знаю, где я могу это изменить.

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

 Route::filter('admin', function() { if(!Auth::check()) return Redirect::action('HomeController@index'); $user = User::find((Auth::user()->id)); if(!$user->hasRole('admin')){ return View::make('errors.401');} }); 

ИСПОЛЬЗОВАНИЕ ЭЛЕКТРИЧЕСКОГО ВОДИТЕЛЯ

  • auth :: попытка () успешно завершена
  • auth :: check () не работает
  • нет ошибки на фильтре

Solutions Collecting From Web of "аутентификация laravel с красноречивым драйвером по ролям"

Проблема заключается в вашей реализации getAuthIdentifier() . Этот метод должен фактически возвращать первичный ключ вашей таблицы, а не имя пользователя, которое используется для входа в систему.

Так что ваш должен выглядеть так:

 public function getAuthIdentifier(){ return $this->id; } 

Или на самом деле, я рекомендую вам очистить вашу модель немного больше, поскольку все методы getSomeAuthStuff реализованы в двух чертах.

Используйте модель по умолчанию на github в качестве базы и добавьте весь свой собственный код (методы ролей, правила и т. Д.),

Справочная информация

Значение, возвращаемое из getAuthIdentifier() будет сохранено в сеансе.
При использовании функции check() впоследствии UserProvider retrieveById будет вызываться в UserProvider . И EloquentUserProvider делает это:

 public function retrieveById($identifier) { return $this->createModel()->newQuery()->find($identifier); } 

Он использует find() который ищет модель по ее первичному ключу (обычно id )