PageSourceSearch

https://doc.routerly.ai/assets/js/25f33896.3cf172f6.js

js routerly.ai collected 2026-10-05 14:50:53 UTC 8,886 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkwebsite=globalThis.webpackChunkwebsite||[]).push([[6541],{3452(e,s,r){r.r(s),r.d(s,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"dashboard/users-and-roles","title":"Users & Roles","description":"Routerly has a role-based access control (RBAC) system for the dashboard. Users are granted permissions via roles. Three built-in roles are provided; you can create additional custom roles with any combination of permissions.","source":"@site/versioned_docs/version-0.1.5/dashboard/users-and-roles.md","sourceDirName":"dashboard","slug":"/dashboard/users-and-roles","permalink":"/0.1.5/dashboard/users-and-roles","draft":false,"unlisted":false,"editUrl":"https://github.com/Inebrio/Routerly/edit/main/versioned_docs/version-0.1.5/dashboard/users-and-roles.md","tags":[],"version":"0.1.5","sidebarPosition":6,"frontMatter":{"title":"Users & Roles","sidebar_position":6},"sidebar":"docsSidebar","previous":{"title":"Usage","permalink":"/0.1.5/dashboard/usage"},"next":{"title":"Settings","permalink":"/0.1.5/dashboard/settings"}}');var n=r(4848),d=r(8453);const l={title:"Users & Roles",sidebar_position:6},t="Dashboard: Users & Roles",o={},a=[{value:"Permissions",id:"permissions",level:2},{value:"Built-in Roles",id:"built-in-roles",level:2},{value:"Managing Users",id:"managing-users",level:2},{value:"Adding a User",id:"adding-a-user",level:3},{value:"Editing a User",id:"editing-a-user",level:3},{value:"Removing a User",id:"removing-a-user",level:3},{value:"Custom Roles",id:"custom-roles",level:2},{value:"Creating a Custom Role",id:"creating-a-custom-role",level:3},{value:"Editing / Deleting a Custom Role",id:"editing--deleting-a-custom-role",level:3},{value:"Project-Level User Assignment",id:"project-level-user-assignment",level:2},{value:"CLI Management",id:"cli-management",level:2}];function c(e){const s={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"dashboard-users--roles",children:"Dashboard: Users & Roles"})}),"\n",(0,n.jsx)(s.p,{children:"Routerly has a role-based access control (RBAC) system for the dashboard. Users are granted permissions via roles. Three built-in roles are provided; you can create additional custom roles with any combination of permissions."}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.h2,{id:"permissions",children:"Permissions"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Permission"}),(0,n.jsx)(s.th,{children:"Description"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"project:read"})}),(0,n.jsx)(s.td,{children:"View projects and their configuration"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"project:write"})}),(0,n.jsx)(s.td,{children:"Create, edit, and delete projects"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"model:read"})}),(0,n.jsx)(s.td,{children:"View registered models"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"model:write"})}),(0,n.jsx)(s.td,{children:"Create, edit, and delete models"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"user:read"})}),(0,n.jsx)(s.td,{children:"View dashboard users"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"user:write"})}),(0,n.jsx)(s.td,{children:"Create, edit, and delete users, assign roles"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"report:read"})}),(0,n.jsx)(s.td,{children:"View usage analytics and request logs"})]})]})]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.h2,{id:"built-in-roles",children:"Built-in Roles"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Role"}),(0,n.jsx)(s.th,{children:"Permissions"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"admin"})}),(0,n.jsx)(s.td,{children:"All permissions"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"operator"})}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"project:read"}),", ",(0,n.jsx)(s.code,{children:"project:write"}),", ",(0,n.jsx)(s.code,{children:"model:read"}),", ",(0,n.jsx)(s.code,{children:"model:write"}),", ",(0,n.jsx)(s.code,{children:"report:read"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"viewer"})}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"project:read"}),", ",(0,n.jsx)(s.code,{children:"model:read"}),", ",(0,n.jsx)(s.code,{children:"report:read"})]})]})]})]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.h2,{id:"managing-users",children:"Managing Users"}),"\n",(0,n.jsx)(s.h3,{id:"adding-a-user",children:"Adding a User"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Open ",(0,n.jsx)(s.strong,{children:"Users"})," in the sidebar"]}),"\n",(0,n.jsxs)(s.li,{children:["Click ",(0,n.jsx)(s.strong,{children:"+ New User"})]}),"\n",(0,n.jsx)(s.li,{children:"Enter the email address, password, and assign a role"}),"\n",(0,n.jsxs)(s.li,{children:["Click ",(0,n.jsx)(s.strong,{children:"Create"})]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"The new user can log in immediately."}),"\n",(0,n.jsx)(s.h3,{id:"editing-a-user",children:"Editing a User"}),"\n",(0,n.jsxs)(s.p,{children:["Click the ",(0,n.jsx)(s.strong,{children:"Edit"})," icon to change the user's email, password, or role."]}),"\n",(0,n.jsx)(s.h3,{id:"removing-a-user",children:"Removing a User"}),"\n",(0,n.jsxs)(s.p,{children:["Click the ",(0,n.jsx)(s.strong,{children:"Delete"}
1)," icon and confirm. The user's session is invalidated immediately."]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.h2,{id:"custom-roles",children:"Custom Roles"}),"\n",(0,n.jsx)(s.p,{children:"Custom roles let you define granular permission sets for specific team members."}),"\n",(0,n.jsx)(s.h3,{id:"creating-a-custom-role",children:"Creating a Custom Role"}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Open ",(0,n.jsx)(s.strong,{children:"Roles"})," in the sidebar"]}),"\n",(0,n.jsxs)(s.li,{children:["Click ",(0,n.jsx)(s.strong,{children:"+ New Role"})]}),"\n",(0,n.jsxs)(s.li,{children:["Give the role a name (e.g. ",(0,n.jsx)(s.code,{children:"billing_reviewer"}),")"]}),"\n",(0,n.jsx)(s.li,{children:"Check the permissions this role should have"}),"\n",(0,n.jsxs)(s.li,{children:["Click ",(0,n.jsx)(s.strong,{children:"Save"})]}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"Custom roles can be assigned to users the same way as built-in roles."}),"\n",(0,n.jsx)(s.h3,{id:"editing--deleting-a-custom-role",children:"Editing / Deleting a Custom Role"}),"\n",(0,n.jsxs)(s.p,{children:["Click ",(0,n.jsx)(s.strong,{children:"Edit"})," to change the role's permissions. Users with this role are affected 
1immediately."]}),"\n",(0,n.jsxs)(s.p,{children:["Click ",(0,n.jsx)(s.strong,{children:"Delete"})," to remove the role. Users who had this role will lose their dashboard access. Reassign them first."]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.h2,{id:"project-level-user-assignment",children:"Project-Level User Assignment"}),"\n",(0,n.jsxs)(s.p,{children:["Users can also be assigned to specific projects (from the project's ",(0,n.jsx)(s.strong,{children:"Users"})," tab). This limits their access to that project without changing their global role."]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.h2,{id:"cli-management",children:"CLI Management"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"# List all users\nrouterly user list\n\n# Add a user\nrouterly user add --email [email protected] --role operator\n\n# Remove a user\nrouterly user remove --email [email protected]\n\n# List roles\nrouterly role list\n\n# Add a custom role\nrouterly role add --name billing_reviewer --permissions report:read\n\n# Remove a custom role\nrouterly role remove --name billing_reviewer\n"})})]})}function h(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453(e,s,r){r.d(s,{R:()=>l,x:()=>t});var i=r(6540);const n={},d=i.createContext(n);function l(e){const s=i.useContext(d);return i.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),i.createElement(d.Provider,{value:s},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.