рд░реЛрд▓-рдЖрдзрд╛рд░рд┐рдд рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП Vue 3 рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЧрд╛рд░реНрдб тАФ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреИрдЯрд░реНрди
рд░реЛрд▓-рдЖрдзрд╛рд░рд┐рдд рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП Vue 3 рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЧрд╛рд░реНрдбреНрд╕ рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреИрдЯрд░реНрдиреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдордЭрд╛рдПрдБ: рд░реВрдЯ meta рдирд┐рдпрдо, рд╕реБрд░рдХреНрд╖рд┐рдд рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ, рджреЛрд╕реНрддрд╛рдирд╛ 401/403 fallback, рдФрд░ рдбреЗрдЯрд╛ рд▓реАрдХ рд╕реЗ рдмрдЪрд╛рд╡ред

рд░реВрдЯ рдЧрд╛рд░реНрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ)\n\nрд░реВрдЯ рдЧрд╛рд░реНрдб рдПрдХ рдХрд╛рдо рдЕрдЪреНрдЫреА рддрд░рд╣ рдХрд░рддреЗ рд╣реИрдВ: рд╡реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдХрдВрдЯреНрд░реЛрд▓ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдХрд┐рд╕реА рд░реВрдЯ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдЕрдЧрд░ рдирд╣реАрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ рдХрд╣рд╛рдБ рднреЗрдЬрд╛ рдЬрд╛рдПред рдЗрд╕рд╕реЗ UX рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рд╣реА рдкрд░реНрдпрд╛рдп рдирд╣реАрдВ рд╣реИред\n\nрдореЗрдиреНрдпреВ рдЖрдЗрдЯрдо рдЫрд┐рдкрд╛рдирд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ, рдЕрд╕рд▓реА рдСрдерд░рд╛рдЗрдЬрд╝реЗрд╢рди рдирд╣реАрдВред рд▓реЛрдЧ рдлрд┐рд░ рднреА URL рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдбреАрдк рд▓рд┐рдВрдХ рдкрд░ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдмреБрдХрдорд╛рд░реНрдХ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдкрдХреА рдПрдХрдорд╛рддреНрд░ рд╕реБрд░рдХреНрд╖рд╛ "рдмрдЯрди рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛" рд╣реИ, рддреЛ рдЖрдкрдХреА рдХреЛрдИ рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИред\n\nрдЧрд╛рд░реНрдб рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рдЪрдордХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдРрдк рдХрдВрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рд░рд╣реЗ рдЬрдмрдХрд┐ рдЙрди рдкреЗрдЬреЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдирд╣реАрдВ рджрд┐рдЦрдиреЗ рдЪрд╛рд╣рд┐рдПтАФрдЬреИрд╕реЗ admin рдПрд░рд┐рдпрд╛рдЬрд╝, рдЗрдВрдЯрд░реНрдирд▓ рдЯреВрд▓реНрд╕, рдпрд╛ рд░реЛрд▓-рдЖрдзрд╛рд░рд┐рдд рдХрд╕реНрдЯрдорд░ рдкреЛрд░реНрдЯрд▓ред\n\nрдЧрд╛рд░реНрдб рдЖрдкрдХреА рдорджрдж рдХрд░рддреЗ рд╣реИрдВ:\n\n- рд░реЗрдВрдбрд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреЗрдЬ рдмреНрд▓реЙрдХ рдХрд░рдирд╛\n- рд▓реЙрдЧрд┐рди рдпрд╛ рдХрд┐рд╕реА рд╕реБрд░рдХреНрд╖рд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдирд╛\n- рдЯреВрдЯреЗ рд╣реБрдП рд╡реНрдпреВ рдХреА рдмрдЬрд╛рдп рд╕рд╛рдлрд╝ 401/403 рд╕реНрдХреНрд░реАрди рджрд┐рдЦрд╛рдирд╛\n- рдЕрдирдЪрд╛рд╣реА рдиреЗрд╡рд┐рдЧреЗрд╢рди рд▓реВрдкреНрд╕ рд╕реЗ рдмрдЪрдирд╛\n\nрдЬреЛ рдЧрд╛рд░реНрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдХреЗрд▓реЗ рдбреЗрдЯрд╛ рдХреА рд░рдХреНрд╖рд╛ рдХрд░ рджреЗрдВред рдЕрдЧрд░ рдХреЛрдИ API рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рдпреВрдЬрд░ рдЙрд╕ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ dev tools рдореЗрдВ рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ) рднрд▓реЗ рд╣реА рдкреЗрдЬ рдмреНрд▓реЙрдХ рд╣реЛред рдЕрд╕рд▓реА рдСрдерд░рд╛рдЗрдЬрд╝реЗрд╢рди рд╕рд░реНрд╡рд░ рдкрд░ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред\n\nрдПрдХ рдЕрдЪреНрдЫрд╛ рд▓рдХреНрд╖реНрдп рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рд╣реИ: рдкреЗрдЬ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ рдФрд░ рдбреЗрдЯрд╛ рднреА рдмреНрд▓реЙрдХ рдХрд░реЗрдВред рдЕрдЧрд░ рдПрдХ рд╕рдкреЛрд░реНрдЯ рдПрдЬреЗрдВрдЯ рдПрдХ admin-only рд░реВрдЯ рдЦреЛрд▓рддрд╛ рд╣реИ, рддреЛ рдЧрд╛рд░реНрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рд░реЛрдХ рджреЗ рдФрд░ тАЬAccess deniedтАЭ рджрд┐рдЦрд╛рдПред рдЕрд▓рдЧ рд╕реЗ, рдЖрдкрдХрд╛ рдмреИрдХрдПрдВрдб admin-only API рдХреЙрд▓реНрд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗ рддрд╛рдХрд┐ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХрднреА рд╡рд╛рдкрд╕ рди рдЖрдПред\n\n## рдПрдХ рд╕рд░рд▓ рд░реЛрд▓ рдФрд░ рдкрд░рдореАрд╢рдиреНрд╕ рдореЙрдбрд▓ рдЪреБрдиреЗрдВ\n\nрдРрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рддрдм рдЙрд▓рдЭ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рд▓рдВрдмреА рд░реЛрд▓ рд╕реВрдЪреА рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╢реБрд░реВ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕реЗрдЯ рд░рдЦреЗрдВ рдЬрд┐рд╕реЗ рд▓реЛрдЧ рдЕрд╕рд▓ рдореЗрдВ рд╕рдордЭреЗрдВ, рдФрд░ рдлрд┐рд░ рдХреЗрд╡рд▓ рддрдм рдлрд╛рдЗрдирд░ permissions рдЬреЛрдбрд╝реЗрдВ рдЬрдм рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд░реНрдж рдорд╣рд╕реВрд╕ рд╣реЛред\n\nрдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╡рд┐рднрд╛рдЬрди рд╣реИ:\n\n- Roles рдпрд╣ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЖрдкрдХреЗ рдРрдк рдореЗрдВ рдХреМрди рд╣реИред\n- Permissions рдпрд╣ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\n\nрдЕрдзрд┐рдХрд╛рдВрд╢ рдЗрдВрдЯрд░реНрдирд▓ рдЯреВрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рддреАрди рд░реЛрд▓ рдХрд╛рдлреА рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ:\n\n- admin: рдпреВрдЬрд╝рд░реНрд╕ рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореИрдиреЗрдЬ рдХрд░реЗрдВ, рд╕рднреА рдбреЗрдЯрд╛ рджреЗрдЦреЗрдВ\n- support: рдХрд╕реНрдЯрдорд░ рд░рд┐рдХреЙрд░реНрдб рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рд╕рдВрднрд╛рд▓реЗ, рд▓реЗрдХрд┐рди рд╕рд┐рд╕реНрдЯрдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд╣реАрдВ рджреЗрдЦреЗрдВ\n- viewer: рдЕрдиреБрдореЛрджрд┐рдд рд╕реНрдХреНрд░реАрди рдкрд░ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреА рдкрд╣реБрдБрдЪ\n\nрд╢реБрд░реВ рдореЗрдВ рддрдп рдХрд░реЗрдВ рдХрд┐ рд░реЛрд▓ рдХрд╣рд╛рдБ рд╕реЗ рдЖрддреЗ рд╣реИрдВред рдЯреЛрдХрди рдХреНрд▓реЗрдореНрд╕ (JWT) рдЧрд╛рд░реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВ рдкрд░ рддрдм рддрдХ stale рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд░рд┐рдлреНрд░реЗрд╢ рди рд╣реЛред рдРрдк рд╕реНрдЯрд╛рд░реНрдЯ рдкрд░ рдпреВрдЬрд░ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдлрд╝реЗрдЪ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ current рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдЧрд╛рд░реНрдбреНрд╕ рдХреЛ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рд╡рд╣ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдкреВрд░рд╛ рди рд╣реЛ рдЬрд╛рдПред\n\nрдЕрдкрдиреА рд░реВрдЯ рдХрд╝рд┐рд╕реНрдореЛрдВ рдХреЛ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд░рдЦреЗрдВ: public рд░реВрдЯ (рд╕рднреА рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ), authenticated рд░реВрдЯ (session рдЪрд╛рд╣рд┐рдП), рдФрд░ restricted рд░реВрдЯ (рд░реЛрд▓ рдпрд╛ permission рдЪрд╛рд╣рд┐рдП)ред\n\n## рд░реВрдЯ meta рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ\n\nрдПрдХреНрд╕реЗрд╕ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд╛рдлрд╝ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдЦреБрдж рд░реВрдЯ рдкрд░ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред Vue Router рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд░реВрдЯ рд░рд┐рдХреЙрд░реНрдб рдкрд░ рдПрдХ meta рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдЯреИрдЪ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХреЗ рдЧрд╛рд░реНрдб рдмрд╛рдж рдореЗрдВ рдЙрд╕реЗ рдкрдврд╝ рд╕рдХреЗрдВред рдЗрд╕рд╕реЗ рдирд┐рдпрдо рдЙрди рдкреЗрдЬреЛрдВ рдХреЗ рдкрд╛рд╕ рд░рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рдкреНрд░реЛрдЯреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред\n\nрдПрдХ рд╕рд░рд▓ meta рд╕реНрд╡рд░реВрдк рдЪреБрдиреЗрдВ рдФрд░ рдкреВрд░реЗ рдРрдк рдореЗрдВ рдЙрд╕ рдкрд░ рдЯрд┐рдХреЗ рд░рд╣реЗрдВред\n\njs\nconst routes = [\n {\n path: \"/admin\",\n component: () =\u003e import(\"@/pages/AdminLayout.vue\"),\n meta: { requiresAuth: true, roles: [\"admin\"] },\n children: [\n {\n path: \"users\",\n component: () =\u003e import(\"@/pages/AdminUsers.vue\"),\n // inherits requiresAuth + roles from parent\n },\n {\n path: \"audit\",\n component: () =\u003e import(\"@/pages/AdminAudit.vue\"),\n meta: { permissions: [\"audit:read\"] },\n },\n ],\n },\n {\n path: \"/tickets\",\n component: () =\u003e import(\"@/pages/Tickets.vue\"),\n meta: { requiresAuth: true, permissions: [\"tickets:read\"], readOnly: true },\n },\n]\n\n\nрдиреЗрд╕реНрдЯреЗрдб рд░реВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рддрдп рдХрд░реЗрдВ рдХрд┐ рдирд┐рдпрдо рдХреИрд╕реЗ рдорд┐рд▓реЗрдВрдЧреЗред рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдРрдкреНрд╕ рдореЗрдВ children рдХреЛ parent requirements рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдкрдиреЗ рдЧрд╛рд░реНрдб рдореЗрдВ рд╣рд░ рдореИрдЪ рдХрд┐рдП рдЧрдП рд░реВрдЯ рд░рд┐рдХреЙрд░реНрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ (рдХреЗрд╡рд▓ to.meta рдирд╣реАрдВ) рддрд╛рдХрд┐ parent рдирд┐рдпрдо рд╕реНрдХрд┐рдк рди рд╣реЛрдВред\n\nрдПрдХ рдЫреЛрдЯреА рд╕реА рдбрд┐рдЯреЗрд▓ рдЬреЛ рдмрд╛рдж рдореЗрдВ рд╕рдордп рдмрдЪрд╛рддреА рд╣реИ: тАЬрджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВтАЭ рдФрд░ тАЬрд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВтАЭ рдореЗрдВ рдлрд░реНрдХ рдХрд░реЗрдВред рдПрдХ рд░реВрдЯ support рдФрд░ admins рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди edits support рдХреЗ рд▓рд┐рдП disable рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред meta рдореЗрдВ readOnly: true рдлрд╝реНрд▓реИрдЧ UI рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ (actions disable рдХрд░рдирд╛, destructive рдмрдЯрди рдЫреБрдкрд╛рдирд╛) рдмрд┐рдирд╛ рдпрд╣ рд╕рдордЭрд╛рдП рдХрд┐ рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рд╣реИред\n\n## рдСрде рд╕реНрдЯреЗрдЯ рддреИрдпрд╛рд░ рд░рдЦреЗрдВ рддрд╛рдХрд┐ рдЧрд╛рд░реНрдб рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХрд╛рдо рдХрд░реЗрдВ\n\nрдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдЧрд╛рд░реНрдб рдмрдЧ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЖрддреЗ рд╣реИрдВ: рдЧрд╛рд░реНрдб рддрдм рдЪрд▓рддрд╛ рд╣реИ рдЬрдм рдРрдк рдЕрднреА рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдпреВрдЬрд░ рдХреМрди рд╣реИред\n\nрдСрде рдХреЛ рдПрдХ рдЫреЛрдЯреЗ рд╕реНрдЯреЗрдЯ рдорд╢реАрди рдХреА рддрд░рд╣ рдЯреНрд░реАрдЯ рдХрд░реЗрдВ рдФрд░ рдЙрд╕реЗ рд╕рд┐рдВрдЧрд▓ рд╕реЛрд░реНрд╕ рдСрдлрд╝ рдЯреНрд░реБрде рдмрдирд╛рдПрдБред рдЖрдк рддреАрди рд╕реНрдкрд╖реНрдЯ рд╕реНрдЯреЗрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:\n\n- unknown: рдРрдк рдЕрднреА рд╢реБрд░реВ рд╣реБрдЖ рд╣реИ, session рдЕрднреА рдЪреЗрдХ рдирд╣реАрдВ рд╣реБрдЖ\n- logged out: session рдЪреЗрдХ рдкреВрд░рд╛ рд╣реБрдЖ, рдХреЛрдИ рд╡реИрдз рдпреВрдЬрд░ рдирд╣реАрдВ\n- logged in: рдпреВрдЬрд░ рд▓реЛрдб рд╣реЛ рдЧрдпрд╛, roles/permissions рдЙрдкрд▓рдмреНрдз рд╣реИрдВ\n\nрдирд┐рдпрдо: рдЬрдм рддрдХ рдСрде unknown рд╣реИ roles рди рдкрдврд╝реЗрдВред рдпрд╣реА рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб рд╕реНрдХреНрд░реАрди рдХрд╛ рдлреНрд▓реИрд╢ рдпрд╛ рд▓реЙрдЧрд┐рди рдкрд░ рдЕрдЪрд╛рдирдХ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рджреЗрдЦрддреЗ рд╣реИрдВред\n\n### рд╕реЗрд╢рди рд░рд┐рдлреНрд░реЗрд╢ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рддрдп рдХрд░реЗрдВ\n\nрдПрдХ рд░рд┐рдлреНрд░реЗрд╢ рд░рдгрдиреАрддрд┐ рдЪреБрдиреЗрдВ рдФрд░ рдЙрд╕реЗ predictable рд░рдЦреЗрдВ (рдЙрджрд╛рд╣рд░рдг: рдПрдХ рдЯреЛрдХрди рдкрдврд╝реЗрдВ, рдПрдХ "who am I" рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЙрд▓ рдХрд░реЗрдВ, рдпреВрдЬрд░ рд╕реЗрдЯ рдХрд░реЗрдВ)ред\n\nрдПрдХ рд╕реНрдерд┐рд░ рдкреИрдЯрд░реНрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:\n\n- рдРрдк рд▓реЛрдб рдкрд░, auth рдХреЛ unknown рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╕рд┐рдВрдЧрд▓ рд░рд┐рдлреНрд░реЗрд╢ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рд╢реБрд░реВ рдХрд░реЗрдВ\n- рдЧрд╛рд░реНрдбреНрд╕ рдХреЛ рддрднреА resolve рдХрд░реЗрдВ рдЬрдм рд░рд┐рдлреНрд░реЗрд╢ рдЦрддреНрдо рд╣реЛ рдЬрд╛рдП (рдпрд╛ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реЛ)\n- рдпреВрдЬрд░ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ cache рдХрд░реЗрдВ, route meta рдореЗрдВ рдирд╣реАрдВ\n- рд╡рд┐рдлрд▓рддрд╛ рдкрд░, auth рдХреЛ logged out рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ\n- рдПрдХ ready рдкреНрд░реЙрдорд┐рд╕ (рдпрд╛ рд╕рдорд╛рди) рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЧрд╛рд░реНрдб await рдХрд░ рд╕рдХреЗрдВ\n\nрдПрдХ рдмрд╛рд░ рдпрд╣ рдореМрдЬреВрдж рд╣реЛ рдЬрд╛рдП, рдЧрд╛рд░реНрдб рд▓реЙрдЬрд┐рдХ рд╕рд░рд▓ рд░рд╣рддрд╛ рд╣реИ: auth рдХреЗ ready рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ, рдлрд┐рд░ рдПрдХреНрд╕реЗрд╕ рддрдп рдХрд░реЗрдВред\n\n## рдЪрд░рдг-рджрд░-рдЪрд░рдг: рд░реВрдЯ-рд▓реЗрд╡рд▓ рдСрдерд░рд╛рдЗрдЬрд╝реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдВ\n\nрдПрдХ рд╕рд╛рдлрд╝ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдирд┐рдпрдо рдПрдХ рдЧреНрд▓реЛрдмрд▓ рдЧрд╛рд░реНрдб рдореЗрдВ рд░рдЦреЗрдВ, рдФрд░ рдкрд░-рд░реВрдЯ рдЧрд╛рд░реНрдб рдХреЗрд╡рд▓ рддрднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ рдЬрдм рдХрд┐рд╕реА рд░реВрдЯ рдХреЛ рд╕рдЪ рдореЗрдВ рд╕реНрдкреЗрд╢рд▓ рд▓реЙрдЬрд┐рдХ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛред\n\n### 1) рдПрдХ рдЧреНрд▓реЛрдмрд▓ beforeEach рдЧрд╛рд░реНрдб рдЬреЛрдбрд╝реЗрдВ\n\njs\n// router/index.js\nrouter.beforeEach(async (to) =\u003e {\n const auth = useAuthStore()\n\n // Step 2: wait for auth initialization when needed\n if (!auth.ready) await auth.init()\n\n // Step 3: check authentication, then roles/permissions\n if (to.meta.requiresAuth \u0026\u0026 !auth.isAuthenticated) {\n return { name: 'login', query: { redirect: to.fullPath } }\n }\n\n const roles = to.meta.roles\n if (roles \u0026\u0026 roles.length \u003e 0 \u0026\u0026 !roles.includes(auth.userRole)) {\n return { name: 'forbidden' } // 403\n }\n\n // Step 4: allow navigation\n return true\n})\n\n\nрдпрд╣ рдЕрдзрд┐рдХрддрд░ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ рдмрд┐рдирд╛ рдЪреЗрдХреНрд╕ рдХреЛ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдореЗрдВ рдлреИрд▓рд╛рдПред\n\n### рдЬрдм beforeEnter рдмреЗрд╣рддрд░ рдлрд┐рдЯ рд╣реИ\n\nbeforeEnter рддрдм рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдирд┐рдпрдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░реВрдЯ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ, рдЬреИрд╕реЗ тАЬрдХреЗрд╡рд▓ рдЯрд┐рдХрдЯ рдХрд╛ рдорд╛рд▓рд┐рдХ рдпрд╣ рдкреЗрдЬ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИтАЭ рдФрд░ рдпрд╣ to.params.id рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдЫреЛрдЯрд╛ рд░рдЦреЗрдВ рдФрд░ рд╡рд╣реА auth рд╕реНрдЯреЛрд░ reuse рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрдВрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рд░рд╣реЗред\n\n## рд╕реБрд░рдХреНрд╖рд┐рдд рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯреНрд╕ рдмрд┐рдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдЫреЗрдж рдЦреЛрд▓реЗ\n\nрд░реАрдбрд╛рдпрд░реЗрдХреНрдЯреНрд╕ рдЖрдкрдХреА рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдХреЛ рдЪреБрдкрдЪрд╛рдк рдЙрд▓рдЯ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдЧрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЯреНрд░рд╕реНрдЯ рдХрд░ рд▓реЗрдВред\n\nрдЖрдо рдкреИрдЯрд░реНрди рдпрд╣ рд╣реИ: рдЬрдм рдпреВрдЬрд░ рд▓реЙрдЧ рдЖрдЙрдЯ рд╣реЛ, рдЙрдиреНрд╣реЗрдВ login рдкрд░ рднреЗрдЬреЛ рдФрд░ returnTo рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рдХрд░реЛред рд▓реЙрдЧрд┐рди рдХреЗ рдмрд╛рдж, рдЙрд╕реЗ рдкрдврд╝реЛ рдФрд░ рд╡рд╣рд╛рдБ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЛред рдЬреЛрдЦрд┐рдо рд╣реИ open redirects (рдпреВрдЬрд╝рд░реНрд╕ рдХреЛ рдЕрдирдЪрд╛рд╣реЗ рдЬрдЧрд╣ рднреЗрдЬрдирд╛) рдФрд░ рд▓реВрдкреНрд╕ред\n\nрд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд░рд▓ рд░рдЦреЗрдВ:\n\n- рд▓реЙрдЧ-рдЖрдЙрдЯ рдпреВрдЬрд╝рд░реНрд╕ рдХреЛ Login рднреЗрдЬреЗрдВ рдФрд░ returnTo рдХреЛ рдХрд░рдВрдЯ рдкрд╛рде рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред\n- рд▓реЙрдЧ-рдЗрди рдкрд░ рдкрд░рдВрддреБ рдЕрдирдСрдерд░рд╛рдЗрдЬрд╝реНрдб рдпреВрдЬрд╝рд░реНрд╕ рдХреЛ рд╕рдорд░реНрдкрд┐рдд Forbidden рдкреЗрдЬ рдкрд░ рднреЗрдЬреЗрдВ (Login рдирд╣реАрдВ)ред\n- рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ returnTo рдорд╛рдиреЛрдВ рдХреЛ рд╣реА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдкрд╣рдЪрд╛рдирддреЗ рд╣реИрдВред\n- рдПрдХ рд▓реВрдк рдЪреЗрдХ рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдХрднреА рдЙрд╕реА рдЬрдЧрд╣ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рди рдХрд░реЗрдВред\n\njs\nconst allowedReturnTo = (to) =\u003e {\n if (!to || typeof to !== 'string') return null\n if (!to.startsWith('/')) return null\n // optional: only allow known prefixes\n if (!['/app', '/admin', '/tickets'].some(p =\u003e to.startsWith(p))) return null\n return to\n}\n\nrouter.beforeEach((to) =\u003e {\n if (!auth.isReady) return false\n\n if (!auth.isLoggedIn \u0026\u0026 to.name !== 'Login') {\n return { name: 'Login', query: { returnTo: to.fullPath } }\n }\n\n if (auth.isLoggedIn \u0026\u0026 !canAccess(to, auth.user) \u0026\u0026 to.name !== 'Forbidden') {\n return { name: 'Forbidden' }\n }\n})\n\n\n## рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рд▓реАрдХ рд╕реЗ рдмрдЪреЗрдВ\n\nрд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд▓реАрдХ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдпрд╣ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдпреВрдЬрд░ рдЙрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рд╣реИ рдпрд╛ рдирд╣реАрдВред\n\nVue рдореЗрдВ рдпрд╣ рдЕрдХреНрд╕рд░ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдкреЗрдЬ setup() рдореЗрдВ рдбреЗрдЯрд╛ рдлреЗрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рд╛рдЙрдЯрд░ рдЧрд╛рд░реНрдб рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЪрд▓рддрд╛ рд╣реИред рднрд▓реЗ рд╣реА рдпреВрдЬрд░ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП, рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдЕрднреА рднреА рдХрд┐рд╕реА рд╢реЗрдпрд░ рдХрд┐рдП рдЧрдП рд╕реНрдЯреЛрд░ рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд╕реНрдХреНрд░реАрди рдкрд░ рдЭрд▓рдХ рд╕рдХрддрд╛ рд╣реИред\n\nрдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд┐рдпрдо рд╣реИ: рдкрд╣рд▓реЗ authorize рдХрд░реЗрдВ, рдлрд┐рд░ loadред\n\njs\n// router guard: authorize before entering the route\nrouter.beforeEach(async (to) =\u003e {\n await auth.ready() // ensure roles are known\n const required = to.meta.requiredRole\n if (required \u0026\u0026 !auth.hasRole(required)) {\n return { name: 'forbidden' }\n }\n})\n\n\nрддреЗрдЬрд╝ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рд▓реЗрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦреЗрдВред рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ рдХреЛ cancel рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП AbortController рдХреЗ рд╕рд╛рде) рдпрд╛ request id рдЪреЗрдХ рдХрд░рдХреЗ рд▓реЗрдЯ рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдХреЛ ignore рдХрд░реЗрдВред\n\nCaching рдПрдХ рдФрд░ рдЖрдо рдлрдВрджрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк "last loaded customer record" рдХреЛ рдЧреНрд▓реЛрдмрд▓ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ admin-only рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА non-admin рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд╣реА рд╕реНрдХреНрд░реАрди рдЦреЛрд▓рддрд╛ рд╣реИред рдХреИрд╢ рдХреЛ user id рдФрд░ role рдХреЗ рджреНрд╡рд╛рд░рд╛ key рдХрд░реЗрдВ, рдФрд░ logout рдкрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдореЙрдбреНрдпреВрд▓реНрд╕ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ (рдпрд╛ рдЬрдм roles рдмрджрд▓реЗрдВ рддреЛ)ред\n\nрдХреБрдЫ рдЖрджрддреЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реАрдХ рд░реЛрдХрддреА рд╣реИрдВ:\n\n- рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдСрдерд╛рд░рд╛рдЗрдЬрд╝реЗрд╢рди рдХрдиреНрдлрд░реНрдо рд╣реЛрдиреЗ рддрдХ рди рдлреЗрдЪ рдХрд░реЗрдВред\n- рдХреИрд╢реНрдб рдбреЗрдЯрд╛ рдХреЛ user рдФрд░ role рджреНрд╡рд╛рд░рд╛ key рдХрд░реЗрдВ, рдпрд╛ рдкреЗрдЬ-рд▓реЛрдХрд▓ рд░рдЦреЗрдВред\n- рдЬрдм рд░реВрдЯ рдмрджрд▓рддрд╛ рд╣реИ рддреЛ рдЗрди-рдлреНрд▓рд╛рдЗрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ cancel рдпрд╛ ignore рдХрд░реЗрдВред\n\n## рдлреНрд░реЗрдВрдбрд▓реА рдлреЙрд▓рдмреИрдХ: 401, 403, рдФрд░ рдиреЙрдЯ рдлрд╛рдЙрдВрдб\n\n"рдирд╣реАрдВ" рд░рд╛рд╕реНрддреЗ рдЙрддрдиреЗ рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдЬрд┐рддрдиреЗ "рд╣рд╛рдБ" рд░рд╛рд╕реНрддреЗред рдЕрдЪреНрдЫреЗ fallback рдкреЗрдЬ рдпреВрдЬрд╝рд░реНрд╕ рдХреЛ рдУрд░рд┐рдПрдВрдЯреЗрдб рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рд╕рдкреЛрд░реНрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ рдШрдЯрд╛рддреЗ рд╣реИрдВред\n\n### 401: рд▓реЙрдЧрд┐рди рдЪрд╛рд╣рд┐рдП (рдСрдереЗрдВрдЯрд┐рдХреЗрдЯреЗрдб рдирд╣реАрдВ)\n\n401 рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░реЗрдВ рдЬрдм рдпреВрдЬрд░ рд╕рд╛рдЗрди рдЗрди рдирд╣реАрдВ рд╣реИред рд╕рдВрджреЗрд╢ рд╕рд╛рдзрд╛ рд░рдЦреЗрдВ: рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рдЖрдк рдУрд░рд┐рдЬрд┐рдирд▓ рдкреЗрдЬ рдкрд░ рд▓реМрдЯрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ return path рд╡реИрдз рд╣реИ рдХреНрдпрд╛ рдпрд╣ рд╡реЗрд░рд┐рдлрд╛рдИ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдРрдк рдХреЗ рдмрд╛рд╣рд░ рди рдЬрд╛ рд╕рдХреЗред\n\n### 403: рдПрдХреНрд╕реЗрд╕ рдЕрд╕реНрд╡реАрдХреГрдд (рд╕рд╛рдЗрди рдЗрди рд╣реИ, рдкрд░ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ)\n\n403 рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░реЗрдВ рдЬрдм рдпреВрдЬрд░ рд╕рд╛рдЗрди рдЗрди рд╣реИ рдкрд░ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рд╕рдВрджреЗрд╢ рдиреНрдпреВрдЯреНрд░рд▓ рд░рдЦреЗрдВ рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рд╕реЗ рдмрдЪреЗрдВред\n\nрдПрдХ рдареЛрд╕ 403 рдкреЗрдЬ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╢реАрд░реНрд╖рдХ ("Access denied"), рдПрдХ рд╡рд╛рдХреНрдп рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг, рдФрд░ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрдЧрд▓рд╛ рдХрджрдо рд╣реЛрддрд╛ рд╣реИ (рдбреИрд╢рдмреЛрд░реНрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдБ, рдХрд┐рд╕реА рдПрдбрдорд┐рди рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ, рдпрд╛ рдЕрдЧрд░ рд╕рдкреЛрд░реНрдЯ рд╣реИ рддреЛ рдЕрдХрд╛рдЙрдВрдЯ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ)ред\n\n### 404: рдирд╣реАрдВ рдорд┐рд▓рд╛\n\n404 рдХреЛ 401/403 рд╕реЗ рдЕрд▓рдЧ рд╕рдВрднрд╛рд▓реЗрдВред рдЕрдиреНрдпрдерд╛ рд▓реЛрдЧ рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рдЬрдмрдХрд┐ рдкреЗрдЬ рдмрд╕ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред\n\n## рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдЯреВрдЯрдиреЗ рд╡рд╛рд▓реЗ рдЖрдо рдЧрд▓рддрд┐рдпрд╛рдБ\n\nрдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдмрдЧ рд╕рд╛рдзрд╛рд░рдг рд▓реЙрдЬрд┐рдХ рд╕реНрд▓рд┐рдкреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ redirect loops, рдЧрд▓рдд рдкреЗрдЬ рдХрд╛ рдлреНрд▓реИрд╢, рдпрд╛ рдпреВрдЬрд╝рд░реНрд╕ рдХреЗ рдлрдВрд╕рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрддреЗ рд╣реИрдВред\n\nрдЖрдо рдЕрдкрд░рд╛рдзреА:\n\n- рдЫрд┐рдкреА UI рдХреЛ "рд╕реБрд░рдХреНрд╖рд╛" рд╕рдордЭрдирд╛ред рд╣рдореЗрд╢рд╛ рд░рд╛рдЙрдЯрд░ рдФрд░ API рджреЛрдиреЛрдВ рдореЗрдВ рд░реЛрд▓реНрд╕ рд▓рд╛рдЧреВ рдХрд░реЗрдВред\n- logout/login рдХреЗ рдмрд╛рдж stale state рд╕реЗ roles рдкрдврд╝рдирд╛ред\n- рдЕрдирдСрдерд░рд╛рдЗрдЬрд╝реНрдб рдпреВрдЬрд╝рд░реНрд╕ рдХреЛ рдХрд┐рд╕реА рдФрд░ рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб рд░реВрдЯ рдкрд░ redirect рдХрд░рдирд╛ (рддреБрд░рдВрдд рд▓реВрдк)ред\n- рд░рд┐рдлреНрд░реЗрд╢ рдкрд░ "auth рдЕрднреА рд▓реЛрдб рд╣реЛ рд░рд╣реА рд╣реИ" рдкрд▓ рдХреА рдЕрдирджреЗрдЦреА рдХрд░рдирд╛ред\n- 401 рдФрд░ 403 рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдорд┐рд╢реНрд░рд┐рдд рдХрд░рдирд╛, рдЬрд┐рд╕рд╕реЗ рдпреВрдЬрд╝рд░реНрд╕ рднреНрд░рдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред\n\nрдПрдХ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдЙрджрд╛рд╣рд░рдг: рдПрдХ рд╕рдкреЛрд░реНрдЯ рдПрдЬреЗрдВрдЯ рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реА рд╕рд╛рдЭрд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдПрдХ admin рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдкрдХрд╛ рдЧрд╛рд░реНрдб cached role рдкрдврд╝ рд▓реЗрдЧрд╛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдирдпрд╛ session рдХрдиреНрдлрд░реНрдо рд╣реЛ, рддреЛ рдЖрдк admin рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛, рдЗрд╕рд╕реЗ рднреА рдмреБрд░рд╛, рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдРрд╕реА рдкрд╣реБрдБрдЪ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред\n\n## рд╢рд┐рдк рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреНрд╡рд░рд┐рдд рдЪреЗрдХрд▓рд┐рд╕реНрдЯ\n\nрдПрдХ рдЫреЛрдЯрд╛ рдкрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдЙрди рдХреНрд╖рдгреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗ рдЬрд╣рд╛рдБ рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдЖрдорддреМрд░ рдкрд░ рдЯреВрдЯрддрд╛ рд╣реИ: рдзреАрд▓реЗ рдиреЗрдЯрд╡рд░реНрдХ, рдПрдХреНрд╕рдкрд╛рдпрд░ рд╕рддреНрд░, рдФрд░ рдмреБрдХрдорд╛рд░реНрдХ рдХрд┐рдП рдЧрдП URLsред\n\n- рд╣рд░ рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб рд░реВрдЯ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ meta requirements рд╣реЛрдВред\n- рдЧрд╛рд░реНрдбреНрд╕ auth-loading рд╕реНрдЯреЗрдЯ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░реЗрдВ рдмрд┐рдирд╛ рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб UI рдХрд╛ рдлреНрд▓реИрд╢ рдХрд┐рдПред\n- рдЕрдирдСрдерд░рд╛рдЗрдЬрд╝реНрдб рдпреВрдЬрд╝рд░реНрд╕ рдХреЛ рдПрдХ рд╕рд╛рдлрд╝ 403 рдкреЗрдЬ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдП (рдХрдиреНрдлреНрдпреВрдЬрд╝рд┐рдВрдЧ рд╣реЛрдо рдмрд╛рдЙрдВрд╕ рдирд╣реАрдВ)ред\n- рдХреЛрдИ рднреА "return to" рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╡реЗрд▓рд┐рдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдФрд░ рд▓реВрдк рди рдмрдирд╛ рд╕рдХреЗред\n- рд╕рдВрд╡реЗрджрдирд╢реАрд▓ API рдХреЙрд▓реНрд╕ рдХреЗрд╡рд▓ рдСрдерд░рд╛рдЗрдЬрд╝реЗрд╢рди рдХрдиреНрдлрд░реНрдо рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд░рди рд╣реЛрдВред\n\nрдлрд┐рд░ рдПрдХ рд╕реАрдирд╛рд░рд┐рдпреЛ end-to-end рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ: рд╕рд╛рдЗрди рдЖрдЙрдЯ рдХрд░рдХреЗ рдПрдХ рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб URL рдирдИ рдЯреИрдм рдореЗрдВ рдЦреЛрд▓реЗрдВ, рдмреЗрд╕рд┐рдХ рдпреВрдЬрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ, рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдпрд╛ рддреЛ рдЗрдЪреНрдЫрд┐рдд рдкреЗрдЬ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ (рдЕрдЧрд░ рдЕрдиреБрдорддрд┐ рд╣реИ) рдпрд╛ рдПрдХ рд╕рд╛рдлрд╝ 403 рд╡ рдЕрдЧрд▓рд╛ рдХрджрдо рджреЗрдЦрддреЗ рд╣реИрдВред\n\n## рдЙрджрд╛рд╣рд░рдг: рдПрдХ рдЫреЛрдЯреЗ рд╡реЗрдм рдРрдк рдореЗрдВ support рдмрдирд╛рдо admin рдПрдХреНрд╕реЗрд╕\n\nрдорд╛рди рд▓реАрдЬрд┐рдП рдПрдХ рд╣реЗрд▓реНрдкрдбреЗрд╕реНрдХ рдРрдк рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рд░реЛрд▓ рд╣реИрдВ: support рдФрд░ adminред Support рдЯрд┐рдХрдЯреЛрдВ рдХреЛ рдкрдврд╝ рдФрд░ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддрд╛ рд╣реИред Admin рднреА рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмрд┐рд▓рд┐рдВрдЧ рдФрд░ рдХрдВрдкрдиреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореИрдиреЗрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИред\n\n- /tickets/:id support рдФрд░ admin рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╣реИ\n- /settings/billing рд╕рд┐рд░реНрдлрд╝ admin рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╣реИ\n\nрдЕрдм рдПрдХ рдЖрдо рдкрд▓: рдПрдХ support рдПрдЬреЗрдВрдЯ рдкреБрд░рд╛рдиреЗ рдмреБрдХрдорд╛рд░реНрдХ рд╕реЗ /settings/billing рдХрд╛ рдбреАрдк рд▓рд┐рдВрдХ рдЦреЛрд▓рддрд╛ рд╣реИред рдЧрд╛рд░реНрдб рдХреЛ рдкреЗрдЬ рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд░реВрдЯ meta рдЪреЗрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдпреВрдЬрд░ рд▓реЙрдЧ рдЗрди рд╣реИ рдкрд░ рд░реЛрд▓ рдирд╣реАрдВ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдлреЙрд▓рдмреИрдХ (403) рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред\n\nрджреЛ рд╕рдВрджреЗрд╢ рдорд╛рдпрдиреЗ рд░рдЦрддреЗ рд╣реИрдВ:\n\n- Login required (401): тАЬPlease sign in to continue.тАЭ\n- Access denied (403): тАЬYou do not have access to Billing Settings.тАЭ\n\nрдЬреЛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: billing рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдорд╛рдЙрдВрдЯ рд╣реЛ рдЬрд╛рдП, рдпрд╛ billing рдбреЗрдЯрд╛ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдлреЗрдЪ рд╣реЛ рдЬрд╛рдПред\n\nрдорд┐рдб-рд╕реЗрд╢рди рд░реЛрд▓ рдЪреЗрдВрдЬ рднреА рдПрдХ рдПрдЬ рдХреЗрд╕ рд╣реИред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдкреНрд░рдореЛрдЯ рдпрд╛ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореЗрдиреНрдпреВ рдкрд░ рдирд┐рд░реНрднрд░ рди рд░рд╣реЗрдВред рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкрд░ roles рджреЛрдмрд╛рд░рд╛ рдЪреЗрдХ рдХрд░реЗрдВ рдФрд░ рддрдп рдХрд░реЗрдВ рдХрд┐ рдЖрдк active рдкреЗрдЬреЗрд╕ рдХреЛ рдХреИрд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░реЗрдВрдЧреЗ: рдЬрдм рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдмрджрд▓реЗ рддреЛ auth рд╕реНрдЯреЗрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░реЗрдВ, рдпрд╛ рд░реЛрд▓ рдЪреЗрдВрдЬ detect рдХрд░рдХреЗ рдЙрди рдкреЗрдЬреЛрдВ рд╕реЗ redirect рдХрд░ рджреЗрдВ рдЬреЛ рдЕрдм рдЕрдиреБрдордд рдирд╣реАрдВ рд╣реИрдВред\n\n## рдЕрдЧрд▓реЗ рдХрджрдо: рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдореЛрдВ рдХреЛ maintainable рд░рдЦреЗрдВ\n\nрдПрдХ рдмрд╛рд░ рдЧрд╛рд░реНрдбреНрд╕ рдХрд╛рдо рдХрд░ рдЬрд╛рдПрдБ, рдмрдбрд╝рд╛ рдЬреЛрдЦрд┐рдо drift рд╣реИ: рдПрдХ рдирдпрд╛ рд░реВрдЯ рдмрд┐рдирд╛ meta рдХреЗ рд╢рд┐рдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд░реЛрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирд┐рдпрдо inconsistent рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред\n\nрдЕрдкрдиреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдПрдХ рдЫреЛрдЯрд╛ рдЯреЗрд╕реНрдЯ рдкреНрд▓рд╛рди рдмрдирд╛рдХрд░ рд░рдЦреЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рд╣рд░ рдмрд╛рд░ рдирдпрд╛ рд░реВрдЯ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдЪрд▓рд╛ рд╕рдХреЗрдВ:\n\n- Guest рдХреЗ рд░реВрдк рдореЗрдВ: рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб рд░реВрдЯ рдЦреЛрд▓реЗрдВ рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдЖрдк partial content рджреЗрдЦреЗрдВ рдмрд┐рдирд╛ login рдкрд░ рдирд╣реАрдВ рдкрд╣реБрдБрдЪреЗред\n- User рдХреЗ рд░реВрдк рдореЗрдВ: рдПрдХ рдкреЗрдЬ рдЦреЛрд▓реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ 403 рдорд┐рд▓рддрд╛ рд╣реИред\n- Admin рдХреЗ рд░реВрдк рдореЗрдВ: address bar рд╕реЗ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рдбреАрдк рд▓рд┐рдВрдХ рдЖрдЬрд╝рдорд╛рдПрдБред\n- рд╣рд░ рд░реЛрд▓ рдХреЗ рд▓рд┐рдП: рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб рд░реВрдЯ рдкрд░ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░реЗрдВ рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕реНрдерд┐рд░ рд╣реИред\n\nрдЕрдЧрд░ рдЖрдк рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд safety net рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ dev-only view рдпрд╛ console рдЖрдЙрдЯрдкреБрдЯ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд░реВрдЯреНрд╕ рдФрд░ рдЙрдирдХреЗ meta requirements рдХреА рд╕реВрдЪреА рджрд┐рдЦрд╛рдП, рддрд╛рдХрд┐ рдорд┐рд╕рд┐рдВрдЧ рдирд┐рдпрдо рддреБрд░рдВрдд рджрд┐рдЦ рдЬрд╛рдПрдБред\n\nрдЕрдЧрд░ рдЖрдк internal tools рдпрд╛ рдкреЛрд░реНрдЯрд▓ AppMaster (appmaster.io) рдХреЗ рд╕рд╛рде рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╣реА рдЕрдкреНрд░реЛрдЪ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: Vue3 UI рдореЗрдВ рд░реВрдЯ рдЧрд╛рд░реНрдбреНрд╕ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд░рдЦреЗрдВ, рдФрд░ permissions рдХреЛ рд╡рд╣реАрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬрд╣рд╛рдБ рдмреИрдХрдПрдВрдб рд▓реЙрдЬрд┐рдХ рдФрд░ рдбреЗрдЯрд╛ рд░рд╣рддреЗ рд╣реИрдВред\n\nрдПрдХ рд╕реБрдзрд╛рд░ рдЪреБрдиреЗрдВ рдФрд░ рдЙрд╕реЗ end-to-end рд▓рд╛рдЧреВ рдХрд░реЗрдВ: рдбреЗрдЯрд╛-рдлрд╝реЗрдЪ рдЧреЗрдЯрд┐рдВрдЧ рдХрдбрд╝рд╛ рдХрд░реЗрдВ, 403 рдкреЗрдЬ рд╕реБрдзрд╛рд░реЗрдВ, рдпрд╛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд▓реЙрдХ рдбрд╛рдЙрди рдХрд░реЗрдВред рдЫреЛрдЯреЗ рдлрд┐рдХреНрд╕ рд╣реА рд╡реЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рдПрдХреНрд╕реЗрд╕ рдмрдЧреНрд╕ рд░реЛрдХрддреЗ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди
рд░реВрдЯ рдЧрд╛рд░реНрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХреЛред рд╡реЗ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреЗрдЬ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ, рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рд╕рд╛рдлрд╝ 401/403 рд╕реНрдерд┐рддрд┐ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд┐рд╕реА рдпреВрдЬрд░ рдХреЛ рдЖрдкрдХреЗ API рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдмреИрдХрдПрдВрдб рдкрд░ рднреА рд╡рд╣реА рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХрднреА рд▓реМрдЯрд╛рдпрд╛ рди рдЬрд╛рдПред
рдХреНрдпреЛрдВрдХрд┐ UI рдЫрд┐рдкрд╛рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдХреНрдпрд╛ рджреЗрдЦрддрд╛ рд╣реИ, рди рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ URL рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмреБрдХрдорд╛рд░реНрдХ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдбрд╛рдпрд░реЗрдХреНрдЯ рдбрд┐рдк рд▓рд┐рдВрдХ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдкреЗрдЬ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЙрдЯрд░ рдЪреЗрдХ рдЪрд╛рд╣рд┐рдП рдФрд░ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдСрдереЛрд░рд╛рдЗрдЬрд╝реЗрд╢рди рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдЫреЛрдЯрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╕реЗрдЯ рдЪреБрдиреЗ рдЬрд┐рд╕реЗ рд▓реЛрдЧ рд╕рдордЭреЗрдВ, рдФрд░ рддрднреА рдЬрдм рд╕рдЪ рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд▓рдЧреЗ рддрдм рдФрд░ рдЧреНрд░реЗрдиреНрдпреБрд▓рд░ permissions рдЬреЛрдбрд╝реЗрдВред рд╕рд╛рдорд╛рдиреНрдп рдмреЗрд╕рд▓рд╛рдЗрди: admin, support, рдФрд░ viewer. рдЙрд╕рдХреЗ рдмрд╛рдж рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП tickets:read рдпрд╛ audit:read рдЬреИрд╕реЗ permissions рдЬреЛрдбрд╝реЗрдВред рд░реЛрд▓ (рдЖрдк рдХреМрди рд╣реИрдВ) рдФрд░ permission (рдЖрдк рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдЕрд▓рдЧ рд░рдЦреЗрдВред
рд░реВрдЯ рд░рд┐рдХреЙрд░реНрдб рдкрд░ meta рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдо рд░рдЦреЗрдВ, рдЬреИрд╕реЗ requiresAuth, roles, рдФрд░ permissions. рдЗрд╕рд╕реЗ рдирд┐рдпрдо рдЙрди рдкреЗрдЬреЛрдВ рдХреЗ рдкрд╛рд╕ рд░рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рдкреНрд░реЛрдЯреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХрд╛ рдЧреНрд▓реЛрдмрд▓ рдЧрд╛рд░реНрдб predictable рд░рд╣рддрд╛ рд╣реИред рдиреЗрд╕реНрдЯреЗрдб рд░реВрдЯ рдХреЗ рд▓рд┐рдП рд╣рд░ рдореИрдЪ рдХрд┐рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рддрд╛рдХрд┐ parent requirements рд╕реНрдХрд┐рдк рди рд╣реЛрдВред
рдЖрдк to.matched рдкрдврд╝реЗрдВ рдФрд░ рд╕рднреА рдореИрдЪ рдХрд┐рдП рдЧрдП рд░реВрдЯ рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдореЗрдВ requirements рдЬреЛрдбрд╝реЗрдВред рдЗрд╕рд╕реЗ рдПрдХ child рд░реВрдЯ рдЧрд▓рддреА рд╕реЗ parent рдХреЗ requiresAuth рдпрд╛ roles рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛ред рддрдп рдХрд░реЗрдВ рдХрд┐ merge rule рдХреНрдпрд╛ рд╣реЛрдЧрд╛ (рдЖрдо рддреМрд░ рдкрд░: parent рдХреА requirements children рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреА)ред
рдХреНрдпреЛрдВрдХрд┐ рдЧрд╛рд░реНрдб рддрдм рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдРрдк рдЕрднреА рддрдХ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдпреВрдЬрд░ рдХреМрди рд╣реИред рдСрде рдХреЛ рддреАрди рд╕реНрдЯреЗрдЯ рдорд╛рдиреЗрдВтАФunknown, logged out, logged inтАФрдФрд░ рдЬрдм рддрдХ рдСрде unknown рд╣реИ roles рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рди рдХрд░реЗрдВред рдЧрд╛рд░реНрдб рдХреЛ рдПрдХ initialization рд╕реНрдЯреЗрдк (рдЬреИрд╕реЗ рдПрдХ "who am I" рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ) рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рд╛рдПрдВред
рдбрд┐рдлреЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧреНрд▓реЛрдмрд▓ beforeEach рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЙрди рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрдВрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рд╣реЛрдВ рдЬреИрд╕реЗ тАЬrequires loginтАЭ рдФрд░ тАЬrequires role/permission.тАЭ beforeEnter рддрднреАф╜┐чФи рдХрд░реЗрдВ рдЬрдм рдирд┐рдпрдо рд░реВрдЯ-рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХ рд╣реЛ рдФрд░ params рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ (рдЙрджрд╛. "рд╕рд┐рд░реНрдл рдЯрд┐рдХрдЯ рдХрд╛ рдорд╛рд▓рд┐рдХ рдпрд╣ рдкреЗрдЬ рдЦреЛрд▓ рд╕рдХреЗ"). рджреЛрдиреЛрдВ рд╣реА рд░рд╛рд╕реНрддреЗ рдПрдХ рд╣реА auth source of truth рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред
returnTo рдХреЛ рдЕрдирдЯреНрд░рд╕реНрдЯреЗрдб рдЗрдирдкреБрдЯ рд╕рдордЭреЗрдВред рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдкрд╛рдереНрд╕ рд╣реА рдЕрдиреБрдорддрд┐ рджреЗрдВ (рдЙрджрд╛. / рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдФрд░ рдорд╛рдиреНрдп prefixes рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ), рдФрд░ рдПрдХ рд▓реВрдк рдЪреЗрдХ рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдЙрд╕реА рдмреНрд▓реЙрдХ рдХрд┐рдП рдЧрдП рд░реВрдЯ рдкрд░ рд╡рд╛рдкрд╕ рди рдЬрд╛рдПрдБред рд▓реЙрдЧ-рдЖрдЙрдЯ рдпреВрдЬрд░ рдХреЛ Login рдкрд░ рднреЗрдЬреЗрдВ; рд▓реЙрдЧ-рдЗрди рдкрд░ рд▓реЗрдХрд┐рди рдЕрдирдСрдерд░рд╛рдЗрдЬрд╝реНрдб рдпреВрдЬрд░ рдХреЛ рд╕рдорд░реНрдкрд┐рдд 403 рдкреЗрдЬ рдкрд░ рднреЗрдЬреЗрдВред
рдкрд╣рд▓реЗ рдСрдерд░рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ, рдлрд┐рд░ рдбреЗрдЯрд╛ рдлреЗрдЪ рдХрд░реЗрдВред рдЕрдЧрд░ рдкреЗрдЬ setup() рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдмрд╛рдж рдореЗрдВ redirect рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдлрд┐рд░ рднреА рд╕реНрдЯреЛрд░ рдореЗрдВ рдЖрдХрд░ рдлреНрд▓реИрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ рдХреЛ.confirmed authorization рдХреЗ рдкреАрдЫреЗ рдЧреЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрджрд▓рдиреЗ рдкрд░ рдЗрди-рдлреНрд▓рд╛рдЗрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ рдХреЛ cancel рдпрд╛ ignore рдХрд░реЗрдВред
401 рддрдм рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдпреВрдЬрд░ рд╕рд╛рдЗрди рдЗрди рдирд╣реАрдВ рд╣реИред 403 рддрдм рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдпреВрдЬрд░ рд╕рд╛рдЗрди рдЗрди рд╣реИ рд▓реЗрдХрд┐рди рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред 404 рдХреЛ рдЕрд▓рдЧ рд░рдЦреЗрдВ рддрд╛рдХрд┐ рдпреВрдЬрд░ рдпрд╣ рди рд╕реЛрдЪреЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рдЬрдмрдХрд┐ рдкреЗрдЬ рдмрд╕ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реБрд╕рдВрдЧрдд рдлреЙрд▓рдмреИрдХ confusion рдФрд░ рд╕рдкреЛрд░реНрдЯ рдЯрд┐рдХрдЯ рдШрдЯрд╛рддреЗ рд╣реИрдВред


