mirror of
https://github.com/n8n-io/n8n.git
synced 2026-10-22 20:41:50 +02:00
Some checks failed
CI: Python / Checks (push) Has been cancelled
Add a per-login session registry so users can see the browsers and devices signed in to their account and revoke individual sessions or all other sessions from their personal settings. Backend: - New user_login_session entity, migration and repository, keyed by a session id embedded as the JWT jti claim. - LoginSessionService owns the session lifecycle (create on login, touch on refresh, list, revoke, revoke-all-others) and prunes expired rows on read. - The session check is enforced in validateToken, so every auth path (interactive, webhook cookie auth, dynamic credentials) rejects a revoked or logged-out session. Tokens issued before this change carry no jti and fall back to the existing checks until they expire, so no one is logged out on upgrade. - Password change, email change and MFA enable/disable revoke the user's other sessions. - /me/login-sessions endpoints (list, revoke one, revoke all others). Frontend: - Login sessions section in personal settings listing device, IP, last active and sign-in time, with the current session flagged and per-row revoke plus a revoke-all-others action.
11 KiB
11 KiB
user
Description
Table Definition
CREATE TABLE "user" ("id" varchar PRIMARY KEY, "email" varchar(255), "firstName" varchar(32), "lastName" varchar(32), "password" varchar, "personalizationAnswers" text, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "updatedAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "settings" text, "disabled" boolean NOT NULL DEFAULT (FALSE), "mfaEnabled" boolean NOT NULL DEFAULT (FALSE), "mfaSecret" text, "mfaRecoveryCodes" text, "lastActiveAt" date, "roleSlug" varchar(128) NOT NULL DEFAULT ('global:member'), CONSTRAINT "UQ_e12875dfb3b1d92d7d7c5377e22" UNIQUE ("email"), CONSTRAINT "FK_eaea92ee7bfb9c1b6cd01505d56" FOREIGN KEY ("roleSlug") REFERENCES "role" ("slug"))
Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
|---|---|---|---|---|---|---|
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | |||
| disabled | boolean | FALSE | false | |||
| varchar(255) | true | |||||
| firstName | varchar(32) | true | ||||
| id | varchar | true | agent_history auth_identity chat_hub_agents chat_hub_sessions chat_hub_tools dynamic_credential_user_entry evaluation_collection instance_ai_mcp_registry_connections instance_ai_pending_confirmations instance_ai_thread_grants oauth_access_tokens oauth_authorization_codes oauth_refresh_tokens oauth_user_consents project project_relation user_api_keys user_favorites user_login_session workflow_builder_session workflow_publish_history | |||
| lastActiveAt | date | true | ||||
| lastName | varchar(32) | true | ||||
| mfaEnabled | boolean | FALSE | false | |||
| mfaRecoveryCodes | TEXT | true | ||||
| mfaSecret | TEXT | true | ||||
| password | varchar | true | ||||
| personalizationAnswers | TEXT | true | ||||
| roleSlug | varchar(128) | 'global:member' | false | role | ||
| settings | TEXT | true | ||||
| updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false |
Constraints
| Name | Type | Definition |
|---|---|---|
| - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (roleSlug) REFERENCES role (slug) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE |
| id | PRIMARY KEY | PRIMARY KEY (id) |
| sqlite_autoindex_user_1 | PRIMARY KEY | PRIMARY KEY (id) |
| sqlite_autoindex_user_2 | UNIQUE | UNIQUE (email) |
Indexes
| Name | Definition |
|---|---|
| sqlite_autoindex_user_1 | PRIMARY KEY (id) |
| sqlite_autoindex_user_2 | UNIQUE (email) |
| user_role_idx | CREATE INDEX "user_role_idx" ON "user" ("roleSlug") |
Relations
erDiagram
"agent_history" }o--o| "user" : "FOREIGN KEY (publishedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"auth_identity" }o--o| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE"
"chat_hub_agents" }o--|| "user" : "FOREIGN KEY (ownerId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"chat_hub_sessions" }o--|| "user" : "FOREIGN KEY (ownerId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"chat_hub_tools" }o--|| "user" : "FOREIGN KEY (ownerId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"dynamic_credential_user_entry" |o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"evaluation_collection" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"instance_ai_mcp_registry_connections" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"instance_ai_pending_confirmations" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"instance_ai_thread_grants" |o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"oauth_access_tokens" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"oauth_authorization_codes" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"oauth_refresh_tokens" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"oauth_user_consents" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"project" }o--o| "user" : "FOREIGN KEY (creatorId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"project_relation" |o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"user_api_keys" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"user_favorites" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"user_login_session" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflow_builder_session" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflow_publish_history" }o--o| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"user" }o--|| "role" : "FOREIGN KEY (roleSlug) REFERENCES role (slug) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE"
"user" {
datetime_3_ createdAt
boolean disabled
varchar_255_ email
varchar_32_ firstName
varchar id PK
date lastActiveAt
varchar_32_ lastName
boolean mfaEnabled
TEXT mfaRecoveryCodes
TEXT mfaSecret
varchar password
TEXT personalizationAnswers
varchar_128_ roleSlug FK
TEXT settings
datetime_3_ updatedAt
}
"agent_history" {
varchar_36_ agentId FK
varchar_255_ author
datetime_3_ createdAt
varchar publishedById FK
TEXT schema
TEXT skills
TEXT tools
datetime_3_ updatedAt
varchar_36_ versionId PK
}
"auth_identity" {
timestamp createdAt
VARCHAR_64_ providerId PK
VARCHAR_32_ providerType PK
timestamp updatedAt
VARCHAR_36_ userId FK
}
"chat_hub_agents" {
datetime_3_ createdAt
varchar_36_ credentialId FK
varchar_512_ description
TEXT files
TEXT icon
varchar id PK
varchar_64_ model
varchar_256_ name
varchar ownerId FK
varchar_16_ provider
TEXT suggestedPrompts
TEXT systemPrompt
datetime_3_ updatedAt
}
"chat_hub_sessions" {
varchar_36_ agentId FK
varchar_128_ agentName
datetime_3_ createdAt
varchar_36_ credentialId FK
varchar id PK
datetime_3_ lastMessageAt
varchar_64_ model
varchar ownerId FK
varchar_16_ provider
varchar_256_ title
varchar_16_ type
datetime_3_ updatedAt
varchar_36_ workflowId FK
}
"chat_hub_tools" {
datetime_3_ createdAt
TEXT definition
boolean enabled
varchar id PK
varchar_255_ name
varchar ownerId FK
varchar_255_ type
REAL typeVersion
datetime_3_ updatedAt
}
"dynamic_credential_user_entry" {
datetime_3_ createdAt
varchar_16_ credentialId PK
TEXT data
varchar_16_ resolverId PK
datetime_3_ updatedAt
varchar userId PK
}
"evaluation_collection" {
datetime_3_ createdAt
varchar createdById FK
TEXT description
varchar_36_ evaluationConfigId FK
varchar_36_ id PK
TEXT insightsCache
varchar_128_ name
datetime_3_ updatedAt
varchar_36_ workflowId FK
}
"instance_ai_mcp_registry_connections" {
datetime_3_ createdAt
varchar_36_ credentialId FK
varchar id PK
varchar_255_ serverSlug FK
TEXT toolFilter
datetime_3_ updatedAt
varchar userId FK
}
"instance_ai_pending_confirmations" {
varchar_255_ checkpointKey FK
varchar_36_ checkpointTaskId
datetime_3_ createdAt
datetime_3_ expiresAt
varchar_16_ kind
varchar_36_ messageGroupId
varchar_36_ requestId PK
varchar_36_ runId
varchar threadId FK
varchar_64_ toolCallId
datetime_3_ updatedAt
varchar userId FK
}
"instance_ai_thread_grants" {
datetime_3_ createdAt
varchar_512_ grantKey PK
varchar threadId PK
datetime_3_ updatedAt
varchar userId PK
}
"oauth_access_tokens" {
varchar clientId FK
varchar token PK
varchar userId FK
}
"oauth_authorization_codes" {
varchar clientId FK
varchar_255_ code PK
varchar codeChallenge
varchar_255_ codeChallengeMethod
datetime_3_ createdAt
bigint expiresAt
varchar redirectUri
varchar resource
TEXT scope
varchar state
datetime_3_ updatedAt
boolean used
varchar userId FK
}
"oauth_refresh_tokens" {
varchar clientId FK
datetime_3_ createdAt
bigint expiresAt
TEXT scope
varchar_255_ token PK
datetime_3_ updatedAt
varchar userId FK
}
"oauth_user_consents" {
varchar clientId FK
bigint grantedAt
INTEGER id
varchar userId FK
}
"project" {
datetime_3_ createdAt
varchar creatorId FK
TEXT customTelemetryTags
varchar_512_ description
TEXT icon
varchar_36_ id PK
varchar_255_ name
varchar_36_ type
datetime_3_ updatedAt
}
"project_relation" {
datetime_3_ createdAt
varchar_36_ projectId PK
varchar role FK
datetime_3_ updatedAt
varchar userId PK
}
"user_api_keys" {
varchar apiKey
varchar audience
datetime_3_ createdAt
varchar_36_ id PK
varchar_100_ label
datetime_3_ lastUsedAt
TEXT scopes
datetime_3_ updatedAt
varchar userId FK
}
"user_favorites" {
INTEGER id
varchar_255_ resourceId
varchar_64_ resourceType
varchar userId FK
}
"user_login_session" {
varchar_64_ browserIdHash
datetime_3_ createdAt
datetime_3_ expiresAt
varchar_36_ id PK
varchar_45_ ipAddress
datetime_3_ lastActiveAt
datetime_3_ updatedAt
varchar_512_ userAgent
varchar userId FK
}
"workflow_builder_session" {
varchar_255_ activeVersionCardId
datetime_3_ createdAt
varchar id PK
TEXT messages
TEXT previousSummary
varchar_255_ resumeAfterRestoreMessageId
datetime_3_ updatedAt
varchar userId FK
varchar_36_ workflowId FK
}
"workflow_publish_history" {
datetime_3_ createdAt
varchar_36_ event
INTEGER id
varchar userId FK
varchar_36_ versionId FK
varchar_36_ workflowId FK
}
"role" {
datetime_3_ createdAt
TEXT description
TEXT displayName
TEXT roleType
varchar_128_ slug PK
boolean systemRole
datetime_3_ updatedAt
}
Generated by tbls