2014-02-12 2 views
4

Хорошо, поэтому, чтобы это было просто, у меня есть таблица users и модель User. Таблица содержит уникальный идентификатор com_id (плюс другая информация о пользователе), с которой я бы хотел войти в систему, но без пароля.Laravel: Войти с авторизованным водителем, но без пароля

Я хотел бы зарегистрировать пользователя в, и быть в состоянии получить доступ к данным через драйвер Auth: Auth::user()->email и т.д., но у меня возникают некоторые проблемы их регистрации в

if (Auth::attempt(['com_id' => $com_id])) 
{ 
    dd("successful login"); 
} 

С этим. Я получаю сообщение об ошибке относительно UserInterface, поэтому в моей модели я добавляю:

use Illuminate\Auth\UserInterface; 

class User extends Eloquent implements UserInterface { 

    protected $table = 'users'; 

    protected $guarded = array('id'); 

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

    public function getAuthPassword() 
    { 
     return $this->password; 
    } 
} 

Но что мне делать пароль? Я не могу удалить эту функцию, так как это необходимо, и я не уверен, что должен ссылаться getAuthIdentifier?

Любая помощь будет приятной.

Я мог бы справиться с этим через сеансы, но, безусловно, это возможно «обычным» способом.

+0

Взгляните на [это] (http://laravel.com/docs/security#manual). Вы также можете использовать Auth :: loginUsingId(). – Uze

+0

Думаю, я это пробовал, но, похоже, это не так, я попробую еще раз, но это будет единственный способ? – Alias

ответ

5

Я бы сказал, что правильным решением этой проблемы было бы реализовать собственный провайдер auth (который расширяет UserProviderInterface), который не заботится о пароле. Laravel поставляется с несколькими провайдерами: DatabaseUserProvider и EloquentUserProvider, но оба имеют хешированный пароль. Фактически, даже если вы создаете свой собственный поставщик auth, вы должны реализовать метод, который проверяет учетные данные (но эти учетные данные не должны быть основаны на паролях), но этот метод может быть тем, что проверяет идентификатор парового сообщества на API или что-то еще.

Как я понимаю, getAuthIdentifier используется для хранения идентификатора пользователя в сеансе (а также для запоминания сценариев). Так что это в значительной степени просто должен быть любой уникальный идентификатор для пользователя (звучит так, как ваше поле com_id будет делать трюк). getAuthPassword действительно должен возвращать хешированный пароль, но это для совместимости с хэшированным паролем Laravel, предполагающим DatabaseUserProvider и EloquentUserProvider, поэтому вы можете безопасно реализовать этот метод, но не делайте ничего полезного, если вы должны использовать своего собственного провайдера.

Однако, если вы не можете понять, как создать собственный провайдер, чтобы отменить предположения, которые делает Laravel, а затем просто реализовать эти методы, как указано выше, в вашей модели пользователя (уникальный идентификатор для getAuthIdentifier и пустой строки или нет возвращаемое значение для getAuthPassword) и используйте свои собственные средства для извлечения пользователя из базы данных, а затем используйте Auth::login($user), чтобы обойти любую проверку пароля в традиционном смысле.

+0

Спасибо за объяснение, получил его работу после смены нескольких вещей (вернуть идентификатор в нормальное состояние и вернуть пустой ответ на стороне пароля :)) – Alias

+0

Я также смотрю на ту же концепцию в laravel 5.1 .if вы знаете, можете ли вы после – vision

0

На самом деле функции в вашей модели являются:

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

public function getAuthPassword() 
{ 
    return $this->password; 
} 

Они изменчивы и по умолчанию, getAuthIdentifier первичный ключ id из вашей auth установки users таблицы в файле app/config/auth.php, и вы можете изменить таблицу (также модель) для драйвера auth, который будет использоваться для аутентификации пользователя. Итак, если у вас есть таблица users и модель User, тогда все в порядке, убедитесь, что первичный ключ в вашей таблице пользователей - id, и если это не так, как id, то здесь, в этой функции, верните это поле, если это, например, some_id, тогда верните some_id ,

Метод getAuthPassword возвращает password поля по умолчанию, и если вы хотите изменить поле пароля с чем-нибудь еще, например, some_token затем возвращает some_token вместо password like возвращения $this->passwordField; и здесь использовать passwordField в качестве password. Это позволяет вам установить ваш пароль, поле, которое вы установили, будет использоваться для аутентификации пользователя.

Для ввода пароля, пожалуйста, используйте метод mutator для encript поле при сохранении.

5

Чтобы войти в систему без пароля в Laravel 4. Вам просто нужно позвонить методу login.

Auth::login($user);

Этот метод будет войти вашего пользователя без каких-либо учетных данных проверки.

Если вам нужно проверить учетные данные в другой руке, этот метод будет проверять учетные данные.

Auth::attempt(array('email' => $email, 'password' => $password), true);

1

Это хак и может помочь в случае отладки.

В Laravel 5 ссылка на файл /vendor\laravel\framework\src\Illuminate\Auth\EloquentUserProvider.php и его функция-член validateCredentials. Здесь они проверяют, что пароль существует против пользователя (адрес электронной почты, имя пользователя или что-то еще). Вы можете просто return true, если хотите обойти проверку учетных данных.

/** 
    * Validate a user against the given credentials. 
    * 
    * @param \Illuminate\Contracts\Auth\Authenticatable $user 
    * @param array $credentials 
    * @return bool 
    */ 
    public function validateCredentials(UserContract $user, array $credentials) 
    { 
     // return true; // this will bypass the password checking. 
     $plain = $credentials['password']; 

     return $this->hasher->check($plain, $user->getAuthPassword()); 
    } 
Смежные вопросы