Измените плагин OctoberCMS Laravel, чтобы отключить изменение имени пользователя в форме

Я использую OctoberCMS на основе Laravel с официальным плагином Users.

Как я могу изменить этот плагин, чтобы отключить или запретить изменение имени пользователя?

Форму можно легко взломать, чтобы внести изменения.

Плагин

Вот файл на GitHub, который мне нужно отредактировать: Account.php

В функции onUpdate(), где написано $user->fill, сохраняются все поля ввода.

Мне нужно запретить поле username в функции или с помощью валидатора.

public function onUpdate()
{
    if (!$user = $this->user()) {
        return;
    }

    $user->fill(post());
    $user->save();

ОктябрьCMS

Я установил для атрибута Login значение Username.

Атрибут входа

Сведения об обновлении пользователя

На странице обновления пользователя отображаются входные данные формы, которые пользователь может изменить:

Полное имя — это столбец surname в базе данных, который я не использую.
Имя пользователя — это столбец username, который я использую, но он не включен в форма по умолчанию.

обновление учетной записи

Хотя кто-то может добавить поле username в браузер, просто проверив элемент, отредактируйте HTML:

<div class="form-group">
    <label for="accountUsername">Username</label>
    <input name="username" type="text" id="accountUsername" value="Desired Username">
</div>

Отправьте, и он изменит имя и обновит столбец username в базе данных.


person Matt McManis    schedule 09.03.2017    source источник


Ответы (1)


Вы можете расширить модель User примерно так:

\RainLab\User\Models\User::extend(function($model) {

    $model->bindEvent('model.beforeUpdate', function() use ($model) {

        if ($model->isDirty('username')) {

            throw new \ValidationException(['username' => 'Sorry!...']);

        }

    });

});

Приведенный выше код будет иметь глобальное влияние, если он определен в методе регистрации, предотвращая изменение имени пользователя. Чтобы ограничить его только внешним интерфейсом, рассмотрите возможность использования такого выражения, как if (!App::runningInBackend()) { /* ... */ }. В противном случае вы могли бы просто прослушать событие только на этой странице внутри функции кода страницы onInit.

person Samuel Georges    schedule 09.03.2017
comment
Где я должен разместить этот код, в верхней части модели Account.php или User.php? Я считаю, что плагин Users ограничен только внешним интерфейсом, поэтому на серверную часть это не повлияет. - person Matt McManis; 09.03.2017
comment
Я смог заставить это работать и использовать его для большего количества функций, спасибо. - person Matt McManis; 10.03.2017
comment
@MattMcManis Если вам нужно глобальное влияние, определите его в методе boot одного из ваших плагинов, в противном случае, как сказал Самуэль, поместите его в метод onInit вашей страницы. - person B Faley; 10.03.2017
comment
@Meysam У меня есть дополнение к этому вопросу, не могли бы вы взглянуть на него? stackoverflow.com/q/42721364/6806643 - person Matt McManis; 10.03.2017