Nano Hash - криптовалюты, майнинг, программирование

Как разрешить пользователям менять свои пароли в Laravel 7.x?

Существует множество сообщения о том, как разрешить пользователям изменять свои пароли, но многие из них относятся к более старой версии Laravel. Каким будет правильный путь для Laravel v7.x в 2020 году?



Ответы:


1

Во-первых, давайте создадим форму для пользователя.

Несколько примечаний к этой форме:

  • Я сохранил форму как можно проще, чтобы ее можно было читать - токен CSRF создается автоматически с помощью Form :: open
  • Вы должны только использовать «пароль» в качестве имени поля, в котором менеджеры паролей должны автоматически заполнять его. В некоторых ответах предлагается использовать `` пароль '' в качестве имени нового поля пароля, что создает действительно плохой UX.

    {{Form::open(array('url' => '/account/change-password'))}}
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    
    <div class="form-group">
    
        <div class="row">
            <div class="col">
                <label for="password" class="control-label">Current Password</label>
            </div>
            <div class="col">
                {{Form::password('password', array('id' => 'password', 'class' => 'form-control', 'placeholder' => 'Password'))}}
            </div>
        </div>
    </div>
    
    <div class="form-group">
        <div class="row">
            <div class="col">
                <label for="new-password" class="control-label">New Password</label>
            </div>
            <div class="col">
                {{Form::password('new-password', array('id' => 'new-password', 'class' => 'form-control', 'placeholder' => 'New Password'))}}
            </div>
        </div>
    </div>
    
    <div class="form-group">
        <div class="row">
            <div class="col">
                <label for="new-password-confirmation" class="control-label">Re-enter
                    Password</label>
            </div>
            <div class="col">
                {{Form::password('new-password-confirmation', array('id' => 'new-password-confirmation', 'class' => 'form-control', 'placeholder' => 'Confirm Password'))}}
            </div>
        </div>
    </div>
    
    <div class="form-group">
        <button type="submit" class="btn btn-danger">Change Password</button>
    </div>
    {{Form::close()}}
    

Теперь в контроллере, который вы хотите обработать запрос, давайте изменим пароль.

Пара замечаний по этому поводу:

  • Мы проверяем, что пароль не является обычным - список, используемый здесь, не является исчерпывающим (и все в нижнем регистре), и я предлагаю вам обновить его с помощью общие пароли, длина которых равна или превышает вашу минимальную длину
  • Говоря о минимальной длине, отправной точкой для этого дня и возраста должно быть 8 символов.
  • Наконец, не проверяйте длину подтверждения пароля - это просто выдаст вам две ошибки (поскольку это уже выполняется).
  • Наконец, это не проверяет изменение пароля. Используйте что-то вроде Laravel Auditing или даже просто отправьте электронное письмо.

Account.php

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

 /**
 * Change users password
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\RedirectResponse
 */
public function changePassword(Request $request)
{
    if(Auth::Check())
    {
        $requestData = $request->All();
        $validator = $this->validatePasswords($requestData);
        if($validator->fails())
        {
            return back()->withErrors($validator->getMessageBag());
        }
        else
        {
            $currentPassword = Auth::User()->password;
            if(Hash::check($requestData['password'], $currentPassword))
            {
                $userId = Auth::User()->id;
                $user = User::find($userId);
                $user->password = Hash::make($requestData['new-password']);;
                $user->save();
                return back()->with('message', 'Your password has been updated successfully.');
            }
            else
            {
                return back()->withErrors(['Sorry, your current password was not recognised. Please try again.']);
            }
        }
    }
    else
    {
        // Auth check failed - redirect to domain root
        return redirect()->to('/');
    }
}

/**
 * Validate password entry
 *
 * @param array $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
public function validatePasswords(array $data)
{
    $messages = [
        'password.required' => 'Please enter your current password',
        'new-password.required' => 'Please enter a new password',
        'new-password-confirmation.not_in' => 'Sorry, common passwords are not allowed. Please try a different new password.'
    ];

    $validator = Validator::make($data, [
        'password' => 'required',
        'new-password' => ['required', 'same:new-password', 'min:8', Rule::notIn($this->bannedPasswords())],
        'new-password-confirmation' => 'required|same:new-password',
    ], $messages);

    return $validator;
}

/**
 * Get an array of all common passwords which we don't allow
 *
 * @return array
 */
public function bannedPasswords(){
    return [
        'password', '12345678', '123456789', 'baseball', 'football', 'jennifer', 'iloveyou', '11111111', '222222222', '33333333', 'qwerty123'
    ];
}
30.04.2020
  • Здравствуйте, просто хотел спросить об этом. Я постоянно получаю Метод POST не поддерживается для этого маршрута. Я пробую и все другие маршруты, но он не работает (я новичок в laravel) 28.09.2020
  • laravel.com/docs/8.x/validation#rule-confirmed для подтверждения пароля используйте специальное правило. 29.11.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..