Auth & permissões
AuthGuard
Protege uma rota inteira por permissão:
export default function Page() {
return (
<AuthGuard can={[PERMISSIONS.view]} groupSlug={MODULE_CONFIG.moduleSlug}>
<LojaFeature />
</AuthGuard>
);
}- Sem usuário →
unauthorized()(401), exceto comfallback. - Sem permissão →
forbidden()(403), exceto comfallback. groupSlugpermite usar permissões curtas ("criar") em vez do caminho completo ("lojas:criar").
Can
Protege um pedaço de UI (dentro de um AuthGuard pai, herda o groupSlug):
<Can can={[PERMISSIONS.create]}>
<Button onClick={() => modal.onOpen()}>Adicionar</Button>
</Can>isAdmin: true no usuário autenticado libera qualquer verificação de
can/canAny/canAll — é assim que o modo demo
consegue mostrar todos os botões sem simular abilities por módulo.
Feature flags
src/lib/feature-flags/flags.config.ts controla granularmente
criar/editar/visualizar/excluir por módulo — separado da flag
NEXT_PUBLIC_DISABLED_MODULES, que desliga o módulo inteiro (rota + sidebar
- permissão) via
src/modules/registry.ts.
modules: {
organizacao: {
lojas: BASE_FLAGS, // { criar, editar, visualizar, excluir }
},
}isEnabled("modules.organizacao.lojas.visualizar") faz a leitura.
Sessão
Cookies (JWT) + src/middleware.ts protegem toda rota que não esteja em
publicRoutes (/login, /unauthorized, e /docs//changelog, que são
sempre públicas). O axios (src/lib/axios-instance.ts) faz refresh
automático de token em respostas 401.
NEXT_PUBLIC_DISABLE_AUTH
Com a flag ligada, src/middleware.ts pula a checagem de sessão inteira e
useAuthUser retorna um usuário admin sintético sem chamar /auth/me.
Zero mudança no AuthGuard/Can — eles continuam funcionando do jeito que
já funcionavam, só que a fonte da verdade sobre "quem é o usuário" muda.
Detalhes em Dados fake (Faker).