Username Matching#

Comparison Rules#

Usernames are compared after applying Python’s str.lower(). Thus, admin and ADMIN identify the same account, whereas admin and ádmin do not. No other Unicode normalization is applied. Preserving username casing (ACCOUNT_PRESERVE_USERNAME_CASING = True) only affects storage and display, not authentication.

Ensure you use allauth.account.auth_backends.AuthenticationBackend for authentication. Django’s ModelBackend and custom authentication backends may rely solely on database matching and thereby apply different equality rules. Custom backends should apply the same comparison before checking the password.

Database Collations#

The username column should use a collation compatible with the equality rules above: case-insensitive, but accent-sensitive. If the database uses broader rules, as is the case with accent-insensitive collations, it may consider otherwise distinct usernames equal. Such database matches are filtered during authentication, and colliding usernames are rejected during registration. Consequently, usernames such as admin and ádmin cannot coexist when the database itself considers them equal.

A typical PostgreSQL setup is compatible with these requirements. MySQL and MariaDB require more attention because commonly used default collations are accent-insensitive. Choose an accent-sensitive collation if usernames that differ only by accents must be able to coexist.