DEFINE USER
statementUse the DEFINE USER
statement to create system users on SurrealDB
NoteWhile existing logins still function, the DEFINE LOGIN statement has been replaced with DEFINE USER.
DEFINE USER
statement for database or namespace tokens.NoteYou cannot use the DEFINE USER statement to create a record user.
SurrealQL SyntaxDEFINE USER [ OVERWRITE | IF NOT EXISTS ] @name ON [ ROOT | NAMESPACE | DATABASE ] [ PASSWORD @pass | PASSHASH @hash ] [ ROLES @roles ] [ DURATION [ FOR TOKEN @duration [ , ] ] [ FOR SESSION @duration ] ] [ COMMENT @string ]
The following example shows how you can create a ROOT
user using the DEFINE USER
statement.
-- Create the user with an owner role and some example durations DEFINE USER username ON ROOT PASSWORD '123456' ROLES OWNER DURATION FOR SESSION 15m, FOR TOKEN 5s;
The following example shows how you can create a NAMESPACE
user using the DEFINE USER
statement.
-- Specify the namespace USE NS abcum; -- Create the user with an editor role and some example durations DEFINE USER username ON NAMESPACE PASSWORD '123456' ROLES EDITOR DURATION FOR SESSION 12h, FOR TOKEN 1m;
The following example shows how you can create a DATABASE
user using the DEFINE USER
statement.
-- Specify the namespace and database for the user USE NS abcum DB app_vitalsense; -- Create the user with a viewer role and some example durations DEFINE USER username ON DATABASE PASSWORD '123456' ROLES VIEWER DURATION FOR SESSION 5d, FOR TOKEN 2h;
IF NOT EXISTS
clauseAvailable since: v1.3.0
The IF NOT EXISTS
clause can be used to define a user only if it does not already exist. You should use the IF NOT EXISTS
clause when defining a user in SurrealDB if you want to ensure that the user is only created if it does not already exist. If the user already exists, the DEFINE USER
statement will return an error.
It’s particularly useful when you want to safely attempt to define a user without manually checking its existence first.
On the other hand, you should not use the IF NOT EXISTS
clause when you want to ensure that the user definition is updated regardless of whether it already exists. In such cases, you might prefer using the OVERWRITE
clause, which allows you to define a user and overwrite an existing one if it already exists, ensuring that the latest version of the user definition is always in use
-- Create a USER if it does not already exist DEFINE USER IF NOT EXISTS example ON ROOT PASSWORD "example" ROLES OWNER;
OVERWRITE
clauseAvailable since: v2.0.0
The OVERWRITE
clause can be used to define a user and overwrite an existing one if it already exists. You should use the OVERWRITE
clause when you want to modify an existing user definition. If the user already exists, the DEFINE USER
statement will overwrite the existing user definition with the new one.
-- Create an USER and overwrite if it already exists DEFINE USER OVERWRITE example ON ROOT PASSWORD "example" ROLES OWNER;
Currently, only the built-in roles OWNER, EDITOR and VIEWER are available.
Role | Description |
---|---|
OWNER | Can view and edit any resource on the user’s level or below, including user and token (IAM) resources. It also grants full permissions for child resources that support the PERMISSIONS clause (tables, fields, etc.) |
EDITOR | Can view and edit any resource on the user’s level or below, but not users or token (IAM) resources It also grants full permissions for child resources that support the PERMISSIONS clause (tables, fields, etc.) |
VIEWER | Grants permissions to view any resource on the user’s level or below, but not edit. It also grants view permissions for child resources that support the PERMISSIONS clause (tables, fields, etc.) |
Available since: v2.0.0
The duration clause specifies the duration of the token returned after successful authentication with a password or passhash as well as the duration of the session established both using a password or passhash and the aforementioned token. The difference between these concepts is explained in the expiration documentation.