2013-05-28 4 views
2

Как вы сообщаете laravel auth::attempt, что поле пароля хранится в виде открытого текста, а не в предположении, что оно хешировано?laravel 4 auth :: попытка пароля в открытом тексте

С-в guard.php

public function attempt(array $credentials = array(), $remember = false, $login = true) 
{ 
    $this->fireAttemptEvent($credentials, $remember, $login); 

    $user = $this->provider->retrieveByCredentials($credentials); 

    // If an implementation of UserInterface was returned, we'll ask the provider 
    // to validate the user against the given credentials, and if they are in 
    // fact valid we'll log the users into the application and return true. 
    if ($user instanceof UserInterface) 
    { 
     if ($this->provider->validateCredentials($user, $credentials)) 
     { 
      if ($login) $this->login($user, $remember); 

      return true; 
     } 
    } 

    return false; 
} 

или еще лучше, я буду только 2 колонки, один в качестве открытого текста и другого, как password_secured.

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

Cuz Я попробовал это, и получил ошибку Undefined index: password.

$user = array(
     'user_id'   => Input::get('username'), 
     'password_secured' => Input::get('password'), 
     'checklogin'  => 0, 
    ); 

    if (Auth::attempt($user)) { 
     return 'login success'; 
    } 

Дело в том, что я портирования приложения, а не строить с нуля, и мне очень нужны пароли хранятся в незашифрованном виде, потому что другое приложение использует БД (и это в прямом эфире) и закодирован для чтения паролей в открытом тексте.

ответ

3

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

Теперь, предполагая, что вы не хотите прислушиваться к этому предупреждению, способ сделать это довольно хакерский, но работает. Guard, как видно из источник (ищите __construct), предоставляется объект, который реализует UserProviderInterface.

У вас есть куча подходящих объектов. Выберите тот, который вы хотите, и увеличьте его. Нам будет весело с DatabaseUserProvider, хотя этот метод расширения удобен и выполним со всеми из них.

Метод, который мы собираемся распространить, - public function validateCredentials(UserInterface $user, array $credentials). Как следует:

namespace Illuminate\Auth; 
class MyUserInterface extends DatabaseUserProvider { 
    public function validateCredentials(UserInterface $user, array $credentials) { 
     $plain = $credentials['password']; 
     return ($plain === $user->getAuthPassword()); 
    } 
} 

В MyUserInterface расширяет DatabaseUserProvider, который сам по себе обеспечивает UserProviderInterface, MyUserInterface теперь зависимость инъецируемых в Guard в качестве поставщика. Мы выполнили половину работы. Следующий шаг - на самом деле сказать Guard, чтобы загрузить вашу вещь. Я не знаком с тем, как Laravel4 загружает Guard реализаций, но где-то там, где-то в конфиге, вы можете установить MyUserInterface в качестве интерфейса Guard. Я не могу быть более конкретным, чем это.

Кстати, класс должен находиться в том же месте, что и другие реализации интерфейса для Auth.

+0

Спасибо. Получил все настройки, но я все еще ищу реализацию загрузки. Я не могу хешировать весь пароль, потому что другой APP, который использует одну и ту же базу данных, читает его в открытом тексте, и я не могу изменить это приложение, и у меня нет доступа к нему. Я просто занимаюсь веб-сайтом. Приложение представляет собой исполняемый файл C++. – user2415940

+0

Я нашел его в этой строке Guard.php 'if ($ user instanceof MyUserInterface)' – user2415940

+0

OH. Thats wierd его все еще неспособность login. – user2415940

Смежные вопросы