Чтобы предотвратить автоматический 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;
}
Есть ли какие-либо проблемы по соображениям безопасности? Предполагая, что я буду сравнивать только идентификаторы друг с другом, будет ли это гораздо более небезопасным, чем сравнение нескольких свойств? Или есть ли лучшие способы разрешить изменение роли вошедшего в систему пользователя без выхода из системы?