diff --git a/core/modules/user/src/AccountForm.php b/core/modules/user/src/AccountForm.php
index 881244f6f53c90dcf9c916ba4a4dc6be932b1b10..d0c5e8d2d9b2896231c0add0701a76dca86a4e93 100644
--- a/core/modules/user/src/AccountForm.php
+++ b/core/modules/user/src/AccountForm.php
@@ -402,6 +402,7 @@ protected function getEditedFieldNames(FormStateInterface $form_state) {
       'name',
       'pass',
       'mail',
+      'roles',
       'timezone',
       'langcode',
       'preferred_langcode',
@@ -420,6 +421,7 @@ protected function flagViolations(EntityConstraintViolationListInterface $violat
       'name',
       'pass',
       'mail',
+      'roles',
       'timezone',
       'langcode',
       'preferred_langcode',
diff --git a/core/modules/user/tests/modules/user_form_test/src/Hook/UserFormTestHooks.php b/core/modules/user/tests/modules/user_form_test/src/Hook/UserFormTestHooks.php
index f49008597f10aeb6aab1e9b198c9c4414ded3435..106199f413feaff6394b538cab4f860e30653be0 100644
--- a/core/modules/user/tests/modules/user_form_test/src/Hook/UserFormTestHooks.php
+++ b/core/modules/user/tests/modules/user_form_test/src/Hook/UserFormTestHooks.php
@@ -4,6 +4,7 @@
 
 namespace Drupal\user_form_test\Hook;
 
+use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Hook\Attribute\Hook;
 
 /**
@@ -20,4 +21,14 @@ public function formUserCancelFormAlter(&$form, &$form_state) : void {
     $form['access']['#value'] = \Drupal::currentUser()->hasPermission('cancel other accounts');
   }
 
+  /**
+   * Implements hook_entity_base_field_info_alter().
+   */
+  #[Hook('entity_base_field_info_alter')]
+  public function entityBaseFieldInfoAlter(&$fields, EntityTypeInterface $entity_type): void {
+    if ($entity_type->id() === 'user' && \Drupal::keyvalue('user_form_test')->get('user_form_test_constraint_roles_edit')) {
+      $fields['roles']->addConstraint('FieldWidgetConstraint');
+    }
+  }
+
 }
diff --git a/core/modules/user/tests/src/Functional/UserEditTest.php b/core/modules/user/tests/src/Functional/UserEditTest.php
index f9a8dfb1a75c12ffe8b260783911b64a5d0c96ef..ff86fa24908400674fac30e9b2980143eeecbed4 100644
--- a/core/modules/user/tests/src/Functional/UserEditTest.php
+++ b/core/modules/user/tests/src/Functional/UserEditTest.php
@@ -283,4 +283,21 @@ public function testAdminSelfBlocking(): void {
     $this->assertSession()->fieldEnabled('edit-status-1');
   }
 
+  /**
+   * Tests constraint violations are triggered on the user account form.
+   */
+  public function testRolesValidation(): void {
+    $admin_user = $this->drupalCreateUser(['administer users']);
+    $this->drupalLogin($admin_user);
+    $this->drupalGet("user/" . $admin_user->id() . "/edit");
+    $this->submitForm([], 'Save');
+    $this->assertSession()->pageTextContains('The changes have been saved.');
+    \Drupal::keyvalue('user_form_test')->set('user_form_test_constraint_roles_edit', TRUE);
+    \Drupal::service('module_installer')->install(['entity_test', 'user_form_test']);
+    $this->drupalGet("user/" . $admin_user->id() . "/edit");
+    $this->submitForm([], 'Save');
+    $this->assertSession()->pageTextContains('Widget constraint has failed.');
+    $this->assertSession()->pageTextNotContains('The changes have been saved.');
+  }
+
 }