Я пытаюсь аутентифицировать пользователей в своем приложении Laravel.
Я столкнулся со следующей проблемой:
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');} });
ИСПОЛЬЗОВАНИЕ ЭЛЕКТРИЧЕСКОГО ВОДИТЕЛЯ
Проблема заключается в вашей реализации 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
)