@seedgrid/fe-security 2026.7.1 → 2026.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,113 @@
1
+ # @seedgrid/fe-security
2
+
3
+ [![npm version](https://img.shields.io/npm/v/%40seedgrid%2Ffe-security)](https://www.npmjs.com/package/@seedgrid/fe-security)
4
+ [![npm downloads](https://img.shields.io/npm/dm/%40seedgrid%2Ffe-security)](https://www.npmjs.com/package/@seedgrid/fe-security)
5
+ [![TypeScript](https://img.shields.io/badge/types-TypeScript-blue)](https://www.typescriptlang.org/)
6
+
7
+ Módulo de segurança do front SeedGrid: autenticação com sessão server-side (Next.js), 2FA, gestão de usuários, roles, permissões e empresas. É o módulo-base dos demais módulos front (`fe-apikeys`, `fe-audit`, `fe-backup`, `fe-billing-*`, `fe-login-tenancy`, `fe-self-enter`, `fe-subdomain-tenancy` declaram `requires: ["security"]`).
8
+
9
+ ## Sumário
10
+
11
+ - [O que este pacote contém](#o-que-este-pacote-contém)
12
+ - [Telas entregues pelo scaffold](#telas-entregues-pelo-scaffold)
13
+ - [Instalação](#instalação)
14
+ - [Uso rápido](#uso-rápido)
15
+ - [Permissões](#permissões)
16
+ - [Backend correspondente](#backend-correspondente)
17
+ - [Suporte](#suporte)
18
+
19
+ ## O que este pacote contém
20
+
21
+ O pacote tem três camadas:
22
+
23
+ **Lib client-safe** (`@seedgrid/fe-security`) — sem imports de `next/*`, pode entrar em bundle client:
24
+
25
+ - `SecurityPaths` — contrato único dos paths REST (auth, 2FA, users, roles, permissions, companies, me, self-enter), espelho do `RestControllerPath.java` da extensão backend.
26
+ - Helpers de permissão: `normalizePermission`, `hasPermission`, `hasAnyPermission`, `hasAllPermissions`, `buildCrudPermissions`, `createPermissionSet`.
27
+ - DTOs de usuários, roles, permissões, empresas e sessão (`session-contract`, `session-result`, `server-contract`).
28
+ - `securityMessages` — bundle i18n (en, pt-BR, es, fr, pt-PT).
29
+
30
+ **Componentes client** (`@seedgrid/fe-security/client`):
31
+
32
+ - `PermissionProvider` — contexto de permissões do usuário logado.
33
+ - `PickListField`, `StatusBadge` — componentes usados nas telas de CRUD.
34
+
35
+ **Motor server-side** (`@seedgrid/fe-security/server`) — SERVER-ONLY:
36
+
37
+ - `createSecurityServer` — motor de sessão (login, refresh de token, logout, 2FA) com cookie httpOnly; é a fundação sobre a qual os outros módulos compõem os seus engines.
38
+ - Helpers de rota: `toRouteResponse`, respostas Problem+JSON (`toProblem`, `problemResponse`) e helpers de server action.
39
+
40
+ ## Telas entregues pelo scaffold
41
+
42
+ O diretório `scaffold/` é copiado para dentro do app gerado pelo SeedGrid CLI (o app é dono do código e pode editar à vontade):
43
+
44
+ | Tela | Rota | O que faz |
45
+ | --- | --- | --- |
46
+ | Login | `/auth/login` | Autenticação com e-mail/senha; redireciona pro 2FA quando exigido |
47
+ | Verificação 2FA | `/auth/2fa/verify` | Confirma o código do segundo fator (com reenvio) |
48
+ | Esqueci a senha | `/auth/forgot-password` (+ `confirm`, `success`) | Fluxo completo de recuperação de senha |
49
+ | Boas-vindas | `/auth/welcome` | Primeira entrada / confirmação de e-mail |
50
+ | Usuários | `/security/users` (lista, novo, edição) | CRUD de usuários com avatar, membership por empresa |
51
+ | Roles | `/security/roles` (lista, novo, edição) | CRUD de roles com atribuição de permissões |
52
+ | Empresas | `/security/companies` (lista, novo, edição) | CRUD de empresas (guardado por `CompanyManagementGuard`) |
53
+ | Perfil | `/security/profile` | Dados do próprio usuário |
54
+ | Configuração 2FA | `/security/2fa` | Habilitar/desabilitar segundo fator (TOTP) |
55
+ | Trocar senha | `/users/change-password` | Troca de senha do usuário logado |
56
+
57
+ O scaffold também traz o `AuthProvider`, `RouteGuard` (proteção de rotas), `AppShell` com menu por permissão (`useSecurityAppShellSections`), dashboard de segurança e as rotas-proxy de API (`/api/security/session/*`, avatar de usuário).
58
+
59
+ ## Instalação
60
+
61
+ ```bash
62
+ pnpm add @seedgrid/fe-security @seedgrid/fe-core @seedgrid/fe-components
63
+ ```
64
+
65
+ A forma recomendada de consumir o módulo é via **SeedGrid CLI**, que copia o scaffold, registra navegação/i18n e configura o `module.json` automaticamente.
66
+
67
+ ## Uso rápido
68
+
69
+ ```ts
70
+ // src/modules/security/server/server-api.ts (server-only)
71
+ import { createSecurityServer } from "@seedgrid/fe-security/server";
72
+
73
+ export const session = createSecurityServer({
74
+ apiBaseUrl: process.env.SEEDGRID_API_BASE_URL!,
75
+ cookies: { /* nomes dos cookies de sessão do app */ },
76
+ serviceToken: process.env.SEEDGRID_REPORT_API_TOKEN, // fallback server-to-server
77
+ });
78
+ ```
79
+
80
+ ```ts
81
+ // Qualquer módulo dependente compõe sobre a mesma sessão:
82
+ import { createApiKeysServer } from "@seedgrid/fe-apikeys/server";
83
+ export const apiKeys = createApiKeysServer(session);
84
+ ```
85
+
86
+ ```tsx
87
+ // Client: checagem de permissão
88
+ import { hasPermission, buildCrudPermissions } from "@seedgrid/fe-security";
89
+
90
+ const USER_PERMISSIONS = buildCrudPermissions("USER"); // USER_READ, USER_CREATE, ...
91
+ if (hasPermission(userPermissions, USER_PERMISSIONS.read)) {
92
+ // renderiza a lista de usuários
93
+ }
94
+ ```
95
+
96
+ ## Permissões
97
+
98
+ As telas de CRUD seguem a convenção `RECURSO_AÇÃO`: `USER_*`, `ROLE_*`, `COMPANY_*` (`READ`/`CREATE`/`UPDATE`/`DELETE`). O menu do `AppShell` esconde seções que o usuário não pode acessar e o `RouteGuard` bloqueia acesso direto por URL.
99
+
100
+ ## Backend correspondente
101
+
102
+ Este módulo conversa com a extensão Quarkus `seedgrid-quarkus-ext-security`. Os paths de `SecurityPaths` são espelho 1:1 do `RestControllerPath.java` — mudou um path no backend, atualize aqui também.
103
+
104
+ Variável de ambiente exigida pelo scaffold: `SEEDGRID_REPORT_API_TOKEN`.
105
+
106
+ ## Suporte
107
+
108
+ - Issues: https://github.com/SeedGrid/seedgrid-fe-components/issues
109
+ - Repositório: https://github.com/SeedGrid/seedgrid-fe-components
110
+
111
+ ## Licença
112
+
113
+ MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seedgrid/fe-security",
3
- "version": "2026.7.1",
3
+ "version": "2026.7.3",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -52,8 +52,8 @@
52
52
  "next": "15.0.7",
53
53
  "react": "19.0.0",
54
54
  "@types/react": "^19.0.0",
55
- "@seedgrid/fe-components": "2026.7.1",
56
- "@seedgrid/fe-core": "2026.7.1"
55
+ "@seedgrid/fe-components": "2026.7.5",
56
+ "@seedgrid/fe-core": "2026.7.6"
57
57
  },
58
58
  "scripts": {
59
59
  "build": "tsc -p tsconfig.json",
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useEffect, useState } from "react";
3
+ import { Suspense, useEffect, useState } from "react";
4
4
 
5
5
  import { SgButton, SgPanel, SgStack } from "@seedgrid/fe-components";
6
6
  import { useRouter, useSearchParams } from "next/navigation";
@@ -14,7 +14,7 @@ import {
14
14
  securityConfig,
15
15
  } from "@/modules/security";
16
16
 
17
- export default function ForgotPasswordConfirmPage() {
17
+ function ForgotPasswordConfirmContent() {
18
18
  const router = useRouter();
19
19
  const searchParams = useSearchParams();
20
20
  const { t } = useI18n();
@@ -94,3 +94,11 @@ export default function ForgotPasswordConfirmPage() {
94
94
  </PageFrame>
95
95
  );
96
96
  }
97
+
98
+ export default function ForgotPasswordConfirmPage() {
99
+ return (
100
+ <Suspense fallback={null}>
101
+ <ForgotPasswordConfirmContent />
102
+ </Suspense>
103
+ );
104
+ }
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useEffect, useState } from "react";
3
+ import { Suspense, useEffect, useState } from "react";
4
4
 
5
5
  import { SgButton, SgPanel, SgStack } from "@seedgrid/fe-components";
6
6
  import { useSearchParams } from "next/navigation";
@@ -14,7 +14,7 @@ import {
14
14
  securityConfig,
15
15
  } from "@/modules/security";
16
16
 
17
- export default function WelcomePage() {
17
+ function WelcomeContent() {
18
18
  const searchParams = useSearchParams();
19
19
  const { t } = useI18n();
20
20
  const [confirmed, setConfirmed] = useState(false);
@@ -88,3 +88,11 @@ export default function WelcomePage() {
88
88
  </PageFrame>
89
89
  );
90
90
  }
91
+
92
+ export default function WelcomePage() {
93
+ return (
94
+ <Suspense fallback={null}>
95
+ <WelcomeContent />
96
+ </Suspense>
97
+ );
98
+ }