Laravel скрытые атрибуты. например, пароль - безопасность

Согласно http://laravel.com/docs/eloquent, можно скрыть атрибуты из массива или преобразования JSON с помощью защищенной скрытой переменной в модели.

class User extends Eloquent {
    protected $hidden = array('password');
}

Отлично, однако при запуске print_r(User::all()) зашифрованный пароль отправляется с сервера на клиент внутри объекта User.

Это не ограничивается только print_r(), если запрашивается конкретный пользователь, $user->password отображает зашифрованный пароль в представлении.

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

Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
    (
        [0] => User Object
            (
                [hidden:protected] => Array
                    (
                        [0] => password
                    )

                [connection:protected] => 
                [table:protected] => 
                [primaryKey:protected] => id
                [perPage:protected] => 15
                [incrementing] => 1
                [timestamps] => 1
                [attributes:protected] => Array
                    (
                        [id] => 1
                        [email] => [email protected]
                        [first_name] => Admin
                        [last_name] => User
                        [password] => $2y$10$7Wg2Wim9zHbtGQRAi0z6XeapJbAIoh4RhEnVXvdMtFnwcOh5g/W2a
                        [permissions] => 
                        [activated] => 1
                        [activation_code] => 
                        [activated_at] => 
                        [last_login] => 
                        [persist_code] => 
                        [reset_password_code] => 
                        [created_at] => 2013-09-26 10:24:23
                        [updated_at] => 2013-09-26 10:24:23
                    )

Ответ 1

Когда вы запускаете User::all(), он возвращает объект Collection. Эта коллекция содержит всех ваших пользователей в виде объекта. Поэтому ваши пользователи будут содержать свои пароли. Это значит, что вы можете отображать хешированный пароль по любой причине. Однако, как вы сказали ранее, если вы трансформируете коллекцию или пользователей в массивы или JSON, поле пароля должно исчезнуть, если оно скрыто.

Поэтому, если вы хотите избавиться от них, попробуйте запустить следующее:

$array_of_users = Users::all()->toArray();
$json_of_users = Users::all()->toJson();

dd() они оба проверяют их. Поле пароля исчезнет.

Это объясняется в документации Laravel по сериализации.

Ответ 2

Нет, потому что вы НЕ должны делать что-то подобное в производстве (или в реальном мире).

Ваши взгляды, написанные в Blade, могут получить результат User::all() и обработать его, но этот PHP (сервер), а не HTML (клиент), и он преобразует эти данные в HTML до того, как он будет передан клиенту.

Итак, это

print_r(User::all())

Это то, что вы никогда не сделаете, чтобы показать пользователю, это то, что мы используем для отладки, но это на самом деле ничего не значит.

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

Ответ 3

В laravel, если вы возвращаете какой-либо объект модели в контроллере, который представляет любой объект, будет преобразован в JSON.
Это полезно для создания API, и там скрытые поля помогают