Authentication

User Model

Built-in Model

Runique includes a ready-to-use user model that requires no configuration.

Generated table: eihwaz_users

FieldTypeDescription
idPkPrimary key (i32 by default, i64 with the big-pk feature)
usernameStringUnique username
emailStringEmail address
passwordStringArgon2 hash — never stored in plain text
is_activeboolAccount active
is_staffboolAdmin panel access (limited)
is_superuserboolFull access, bypasses all rules
rolesStringCustom roles (nullable)
created_atdatetimeCreation timestamp
updated_atdatetimeLast update timestamp

To create the first superuser:

runique create-superuser

i64 primary key (BigAutoField)

By default, the primary key is i32. To switch to i64:

# project Cargo.toml
runique = { version = "...", features = ["big-pk"] }

RuniqueUser Trait

If you use your own user model instead of the built-in one, you must implement RuniqueUser.

use runique::middleware::auth::RuniqueUser;
use runique::prelude::Pk;

impl RuniqueUser for users::Model {
    fn user_id(&self) -> Pk      { self.id }
    fn username(&self) -> &str       { &self.username }
    fn email(&self) -> &str          { &self.email }
    fn password_hash(&self) -> &str  { &self.password }
    fn is_active(&self) -> bool      { self.is_active }
    fn is_staff(&self) -> bool       { self.is_staff }
    fn is_superuser(&self) -> bool   { self.is_superuser }

    // Optional — custom admin access logic
    fn can_access_admin(&self) -> bool {
        self.is_active() && (self.is_staff() || self.is_superuser())
    }
}

Required Methods

MethodReturnDescription
user_id()PkUnique identifier
username()&strUsername
email()&strEmail address
password_hash()&strPassword hash
is_active()boolAccount is active
is_staff()boolLimited admin access
is_superuser()boolFull admin access

Methods With Default Implementation

MethodDefaultDescription
roles()vec![]Custom roles
can_access_admin()is_active && (is_staff || is_superuser)Admin access logic