2015-10-20 3 views
4

Когда я регистрации нового пользователя в рамках Laravel, я сейчас делаю это так,Laravel 5,1 Bcrypt и Войти

// Creating a new user 
$user = new User; 
$user->firstname = $data['firstname']; 
$user->lastname = $data['lastname']; 
$user->email = $data['email']; 
$user->password = bcrypt($data['password']); 
$user->save(); 

Это прекрасно работает, и я могу войти в приложение , Однако я хочу, чтобы у пользователя была возможность изменить свои пароли на странице настроек. Сделав это, я использовал ту же технику, используя

$newPass = bcrypt($response->new_password); 

и обновление поля пользователя. Однако, после этого, я не могу войти? Я использую встроенную службу аутентификации в laravel для регистрации/входа в систему.

Что я здесь делаю неправильно? и должен ли я сделать это по-другому?

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

Это так запутано ..

Обновлен код контроллера

// Validation 
$this->validate($request, [ 
    'email' => 'email', 
    'password' => 'min:8|confirmed', 
    'current_password' => 'required', 
]); 

// Getting the user ID 
$userId = Auth::id(); 

// Dummy hack check, change later. 
if(!Auth::attempt(['id' => $userId, 'password' => $request->current_password])) 
{ 
    return redirect('settings')->with('alert','current password is wrong.'); 
} 

// Everything is validated and ok to proceed 
if($request->email) 
{ 
    $data['email'] = $request->email; 
} 

if($request->password) 
{ 
    $data['password'] = bcrypt("helloworld"); 
} 

$user = User::where('id',$userId)->update($data); 

dd($data); 

выгрузить данные для входов,

+request: ParameterBag {#40 ▼ 
    #parameters: array:5 [▼ 
     "_token" => "JQIIuCjiKQmbK0X5zCM6czYD1vIoh4PGjLO4qrFm" 
     "email" => "[email protected]" 
     "password" => "thisisnewpass" 
     "password_confirmation" => "thisisnewpass" 
     "current_password" => "helloworld" 
    ] 
    } 
+0

Вы сохранили пользователя после установки нового пароля? – BrokenBinary

+0

Да, база данных обновлена. – Sweepy

+0

Является ли пользователь до сих пор вошел в систему до того, как вы изменили пароль? – BrokenBinary

ответ

0

Этот код находится ближе к тому, как Laravel ручки сброса пароля пользователя внутренне. Попробуйте.

// Getting the User 
$user = Auth::user(); // Gets the currently logged in User 
$credentials = [ 
    'id' => $user->id, 
    'password' => $request->input('current_password') 
]; 

// Make sure current password is correct 
if (!Auth::validate($credentials)) { // Checks the User's credentials 
    return redirect('settings')->with('alert','current password is wrong.'); 
} 

// Change the password 
if ($request->has('password')) { 
    $user->password = bcrypt($request->input('password')); 
} 

// Save any changes 
$user->save(); 

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

+0

Это то же самое, что я делаю, используя bcrypt, однако что-то по-прежнему не так. – Sweepy

0

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

// Validation 
$this->validate($request, [ 
    'email' => 'email', 
    'password' => 'min:8|confirmed', 
    'current_password' => 'required', 
]); 

// Getting the user ID 
$userId = Auth::id(); 
$newPassword = $request->password; 

// Dummy hack check, change later. 
if(!Auth::attempt(['id' => $userId, 'password' => $request->current_password])) 
{ 
    return redirect('settings')->with('alert','Wrong password.'); 
} 

// Everything is validated and ok to proceed 
if($request->email) 
{ 
    $data['email'] = $request->email; 
} 

if($request->password) 
{ 
    $data['password'] = bcrypt($newPassword); 
} 

// Getting, and checking if the current password is corrent. 
$user = User::where('id',$userId)->update($data); 

echo $newPassword . "<br><br>"; 

dd($data); 

Если есть какие-либо объяснения, что я не см., пожалуйста, дайте мне знать, почему. Однако сейчас он работает.

+0

Если вы копируете и вставляете точный пароль '$ request- >' из вашего кода выше в вызов' bcrypt() ', он снова ломается? –

0

Для Laravel в 2017 году, это то, как мы катимся:

//create a setter method in your controller 

public function setPasswordAttribute($password) { 
    if ($password !== null) { 
     if (is_null(request()->bcrypt)) { 
      $this->attributes['password'] = bcrypt($password); 
     } else { 
      $this->attributes['password'] = $password; 
     } 
    } 
} 

Проверить this ссылку все они говорят о размещении его в модели, но она работает внутри моего собственного контроллера.

+0

Этот плохой код. Вы не должны ничего молчать, если аргумент '$ password' приходит как« null ». –