Недостатки безопасности при использовании EquatableUserInterface - PullRequest
1 голос
/ 23 января 2020

Чтобы предотвратить автоматический c выход из системы, как только пользовательские роли меняются, я хотел бы использовать EquatableUserInterface и интегрировать свой собственный метод isEqualTo () (https://symfony.com/doc/current/security/user_provider.html#comparing -users-вручную-with- equatableinterface ). Этот метод в основном такой же, как и в Symfony Core, за исключением того, что я удаляю деталь с ролями:

public function isEqualTo(UserInterface $user): bool
{
    if (!$user instanceof self) {
        return false;
    }

    if ($this->getPassword() !== $user->getPassword()) {
        return false;
    }

    if ($this->getSalt() !== $user->getSalt()) {
        return false;
    }

    /* Remove this part
    $currentRoles = array_map('strval', (array) $this->getRoles());
    $newRoles = array_map('strval', (array) $user->getRoles());
    $rolesChanged = \count($currentRoles) !== \count($newRoles) || \count($currentRoles) !== \count(array_intersect($currentRoles, $newRoles));
    if ($rolesChanged) {
        return false;
    }*/

    if ($this->getUsername() !== $user->getUsername()) {
        return false;
    }

    if ($this->isAccountNonExpired() !== $user->isAccountNonExpired()) {
        return false;
    }

    if ($this->isAccountNonLocked() !== $user->isAccountNonLocked()) {
        return false;
    }

    if ($this->isCredentialsNonExpired() !== $user->isCredentialsNonExpired()) {
        return false;
    }

    if ($this->isEnabled() !== $user->isEnabled()) {
        return false;
    }

    return true;
}

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

1 Ответ

2 голосов
/ 23 января 2020

У меня была эта проблема несколько минут go, и я реализовал свой метод isEqualTo, например:

public function isEqualTo(UserInterface $user): bool
{
    return $this->username === $user->getUsername() && $this->password === $user->getPassword();
}

Это зависит от того, какие свойства вы используете. В моем случае достаточно было проверить эти свойства. По моему мнению, самый безопасный способ - это ваш фрагмент без проверки ролей. Идентификатор не является частью UserInterface.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...