@seedgrid/ai-toolkit 0.0.0-stage → 0.3.0
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/LICENSE +21 -0
- package/README.md +151 -2
- package/dist/adapters/claude.js +114 -0
- package/dist/adapters/codex.js +108 -0
- package/dist/adapters/index.js +17 -0
- package/dist/adapters/shared.js +142 -0
- package/dist/adapters/types.js +1 -0
- package/dist/cli.js +203 -0
- package/dist/commands/common.js +98 -0
- package/dist/commands/doctor.js +290 -0
- package/dist/commands/init.js +9 -0
- package/dist/commands/install.js +107 -0
- package/dist/commands/remove.js +54 -0
- package/dist/commands/review.js +127 -0
- package/dist/commands/status.js +73 -0
- package/dist/commands/update.js +8 -0
- package/dist/commands/validate.js +27 -0
- package/dist/core/apply.js +181 -0
- package/dist/core/blocks.js +64 -0
- package/dist/core/content.js +528 -0
- package/dist/core/env.js +40 -0
- package/dist/core/frontmatter.js +29 -0
- package/dist/core/hash.js +14 -0
- package/dist/core/inspect.js +51 -0
- package/dist/core/lock.js +124 -0
- package/dist/core/paths.js +65 -0
- package/dist/core/plan.js +242 -0
- package/dist/core/tools.js +62 -0
- package/dist/core/types.js +11 -0
- package/dist/core/updates.js +121 -0
- package/docs/arquitetura.md +80 -0
- package/docs/compatibilidade.md +50 -0
- package/docs/formato.md +155 -0
- package/docs/instalacao.md +105 -0
- package/docs/manutencao.md +115 -0
- package/package.json +43 -4
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
- package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
- package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
- package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
- package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
- package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
- package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
- package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
- package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
- package/seedgridKB/SeedGrid/Versoes.md +64 -0
- package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
- package/seedgridKB/manifest.json +142 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, security, rust, configuracao]
|
|
3
|
+
fonte: rust/seedgrid-rust-crate-security
|
|
4
|
+
branch: main
|
|
5
|
+
commit: be738a2d1e
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Configuração Rust — `seedgrid-security`
|
|
10
|
+
|
|
11
|
+
Volta para: [[SeedGrid/Extensions/security/Rust|Porte Rust do security]] · Java: [[SeedGrid/Extensions/security/Configuracao|Configuração do security (Quarkus)]]
|
|
12
|
+
|
|
13
|
+
## 1. Cabeçalho
|
|
14
|
+
|
|
15
|
+
| Item | Valor |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Crate / pacote | diretório `rust/seedgrid-rust-crate-security`, pacote Cargo `seedgrid-security`, lib `seedgrid_security` |
|
|
18
|
+
| Struct de config | `SecurityConfig` (agrega `JwtConfig`, `RefreshTokenConfig`, `PasswordConfig`, `TwoFactorConfig`, `EncryptionConfig`, `PrivacyConfig`, `SelfEnterConfig`, `FrontendConfig`, `AvatarConfig`, `FirstAdminUserConfig`, `DefaultCompanyConfig`, `MailerConfig`, `UserAttributesConfig`, `AccountManagementConfig`) — `src/config.rs` |
|
|
19
|
+
| Mecanismo | variáveis de ambiente lidas com `std::env::var` em `SecurityConfig::from_env()` (no boot, uma vez). O host pode também montar `SecurityConfig::new(JwtConfig)` e alterar campos à mão. Fora do `from_env`, uma única env é lida no `SecurityStateBuilder::build()` (`SEEDGRID_SECURITY_TEMPLATES_DIR`). |
|
|
20
|
+
| Quem chama `from_env` | o host; ou `SecurityPlatform::assemble` (`src/platform.rs`); ou os orquestradores `login-tenancy::assemble_all` e `subdomain-tenancy::assemble_all` |
|
|
21
|
+
| Falha | `from_env` só devolve `Err` quando **nenhuma** fonte de chave RSA está presente (ou base64 inválido / arquivo ilegível). `SecurityPlatform::assemble` trata esse `Err` como "security desabilitado" (`Ok(None)`). Valores numéricos/durações inválidos são **ignorados silenciosamente** (fica o default). |
|
|
22
|
+
| Features Cargo | **nenhuma** (`Cargo.toml` não declara `[features]`). |
|
|
23
|
+
| Origem (caminho base) | todas as origens abaixo são relativas a `rust/seedgrid-rust-crate-security/` |
|
|
24
|
+
|
|
25
|
+
### Convenções de nomes e precedência (Confirmado)
|
|
26
|
+
|
|
27
|
+
O crate aceita **dois "dialetos"** de env, para que o mesmo `dev.env` funcione no Java e no Rust:
|
|
28
|
+
|
|
29
|
+
- `SEEDGRID_SECURITY_*` — nomes usados no `META-INF/microprofile-config.properties` do módulo Java (`${SEEDGRID_SECURITY_...:default}`).
|
|
30
|
+
- `SECURITY_*` — nomes usados nos `application.properties` dos **exemplos Java** (`java/examples/*/application.properties`, ex.: `seedgrid.security.jwt.issuer=${SECURITY_JWT_ISSUER:...}`) e nomes históricos do crate.
|
|
31
|
+
|
|
32
|
+
Regra de precedência quando há os dois: **a primeira env listada que existir vence** (`env::var(a).or_else(|_| env::var(b))`). Na maioria dos grupos o nome `SEEDGRID_*` vem primeiro. Exceções importantes:
|
|
33
|
+
|
|
34
|
+
- **JWT issuer/kid/ttl, refresh, senha, self-enter enabled/public/invite**: só o nome `SECURITY_*` é lido. `SEEDGRID_SECURITY_JWT_ISSUER`, `SEEDGRID_SECURITY_JWT_KID`, `SEEDGRID_SECURITY_JWT_TTL` (nomes do módulo Java) **não** são lidos pelo crate (Confirmado por grep).
|
|
35
|
+
- **2FA, default company corporate/trade name, account audiences**: só o nome `SEEDGRID_*` é lido.
|
|
36
|
+
- "Existir" difere por grupo: em `fe_env`/`first_env` uma env vazia/branca conta como ausente (passa para o alias); em `env::var(a).or_else(...)` simples (ex.: `SEEDGRID_PRIVACY_CRYPTO_KEY`, mailer password, 2FA enabled) uma env **vazia porém definida** vence e é usada.
|
|
37
|
+
|
|
38
|
+
Parsing:
|
|
39
|
+
- **Booleanos** (`parse_bool`): `true/1/yes/on` (sem caixa) → `true`; qualquer outra coisa → `false`. Exceção: `SECURITY_SELF_ENTER_ENABLED/PUBLIC_ENABLED/INVITE_ENABLED` usam comparação literal `v == "true"` (case-sensitive).
|
|
40
|
+
- **Durações** (`parse_duration_to_seconds`): inteiro puro = segundos; ISO-8601 subset `PnDTnHnMnS` (sem semanas/meses/anos); sufixo `8h`/`30m`/`45s`/`30d`. Formato não reconhecido → ignorado (fica o default).
|
|
41
|
+
- **CSV** (`parse_csv` / split manual): itens aparados, vazios descartados.
|
|
42
|
+
|
|
43
|
+
## 2. Propriedades do crate
|
|
44
|
+
|
|
45
|
+
Colunas: **Leitura** = quando é lida. "boot" = `SecurityConfig::from_env()`; "build" = `SecurityStateBuilder::build()`; "struct" = só campo de struct (sem env), definido pelo host.
|
|
46
|
+
|
|
47
|
+
### 2.1 JWT (chaves RSA, issuer, TTL)
|
|
48
|
+
|
|
49
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
50
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
51
|
+
| 🔒 `SEEDGRID_SECURITY_JWT_PRIVATE_KEY_BASE64` → `jwt.private_key_pem` | `Vec<u8>` | base64 do **DER PKCS#8** (sem header PEM); espaços/quebras ignorados | — | Condicional: uma das 4 fontes da chave privada é obrigatória | 1ª na precedência; DER é reembrulhado em PEM `PRIVATE KEY` (`der_to_pem`). Base64 inválido → `Err` | assina o access token RS256 (`crypto::jwt::JwtKeys::from_rsa_pem`) | Java: `seedgrid.security.jwt.private-key-base64` (Confirmado, mesmo nome de env) | boot | `src/config.rs` → `read_rsa_key`; consumo `src/state.rs` → `SecurityStateBuilder::build` |
|
|
52
|
+
| 🔒 `SEEDGRID_SECURITY_JWT_PUBLIC_KEY_BASE64` → `jwt.public_key_pem` | `Vec<u8>` | base64 do **DER X.509/SPKI** | — | Condicional: uma das 4 fontes da pública | idem, label `PUBLIC KEY` | valida o access token | Java: `seedgrid.security.jwt.public-key-base64` | boot | idem |
|
|
53
|
+
| `SEEDGRID_SECURITY_JWT_PRIVATE_KEY_LOCATION` · alias `SECURITY_PRIVATE_KEY_LOCATION` | caminho | arquivo PEM legível | — | Condicional | 2ª fonte; lê o arquivo inteiro. Arquivo ilegível → `Err` (não cai para a próxima fonte) | idem privada | Java: `seedgrid.security.jwt.private-key-location` (default Java `keys/private.pem`; **Rust não tem default**) | boot | `src/config.rs` → `read_rsa_key` |
|
|
54
|
+
| `SEEDGRID_SECURITY_JWT_PUBLIC_KEY_LOCATION` · alias `SECURITY_PUBLIC_KEY_LOCATION` | caminho | arquivo PEM | — | Condicional | idem | idem pública | Java: `seedgrid.security.jwt.public-key-location` | boot | idem |
|
|
55
|
+
| 🔒 `SECURITY_JWT_PRIVATE_KEY_PEM` | string | PEM inline | — | Condicional | 3ª fonte (ignorada se branca) | idem | sem equivalente Java confirmado | boot | idem |
|
|
56
|
+
| `SECURITY_JWT_PUBLIC_KEY_PEM` | string | PEM inline | — | Condicional | 3ª fonte | idem | — | boot | idem |
|
|
57
|
+
| `SECURITY_JWT_PRIVATE_KEY_PEM_FILE` | caminho | arquivo PEM | — | Condicional | 4ª fonte (nome antigo do crate) | idem | — | boot | idem |
|
|
58
|
+
| `SECURITY_JWT_PUBLIC_KEY_PEM_FILE` | caminho | arquivo PEM | — | Condicional | 4ª fonte | idem | — | boot | idem |
|
|
59
|
+
| `SECURITY_JWT_ISSUER` → `jwt.issuer` | `String` | qualquer | `seedgrid` | Não | claim `iss` | `crypto/jwt.rs`; exposto no status do login-tenancy | Java: `seedgrid.security.jwt.issuer` (default Java `https://seedgrid.com.br`); env do módulo Java `SEEDGRID_SECURITY_JWT_ISSUER` **não é lida** | boot | `src/config.rs` → `from_env` |
|
|
60
|
+
| `SECURITY_JWT_KID` → `jwt.kid` | `Option<String>` | string não-branca | `None` (header sem `kid`) | Não | aparado; branco = `None` | `crypto/jwt.rs` (`header.kid`) | Java: `seedgrid.security.jwt.kid` (default Java `seedgrid-key`) | boot | idem |
|
|
61
|
+
| `SECURITY_JWT_TTL` → `jwt.ttl_seconds` | `i64` (s) | duração (ISO-8601/sufixo/inteiro) | `28800` (8h) | Não | precede `SECURITY_JWT_TTL_SECONDS` | validade do access token | Java: `seedgrid.security.jwt.ttl` (PT8H) | boot | idem |
|
|
62
|
+
| `SECURITY_JWT_TTL_SECONDS` | `i64` | inteiro | `28800` | Não | usado só se `SECURITY_JWT_TTL` ausente/inválida (compat) | idem | — | boot | idem |
|
|
63
|
+
|
|
64
|
+
### 2.2 Refresh token
|
|
65
|
+
|
|
66
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
67
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
68
|
+
| `SECURITY_REFRESH_TOKEN_TTL` → `refresh.ttl_days` | `i64` (dias) | duração (`P30D`, `30d`, segundos) | `30` | Não | convertido para dias (`secs/86400`, mínimo 1) | `services/refresh.rs` | Java: `seedgrid.security.refresh-token.ttl` (P30D) | boot | `src/config.rs` → `from_env` |
|
|
69
|
+
| `SECURITY_REFRESH_TOKEN_REUSE_GRACE_WINDOW` → `refresh.reuse_grace_window_secs` | `i64` (s) | duração; `PT0S`/`0` desliga | `30` | Não | janela em que a reapresentação concorrente do mesmo refresh não é tratada como reuso | `services/refresh.rs` (`grace_secs`) | Java: `seedgrid.security.refresh-token.reuse-grace-window` (PT30S) — nome Java por regra kebab-case do `reuseGraceWindow()` | boot | idem |
|
|
70
|
+
| `refresh.reuse_detection` (campo) | `bool` | — | `true` | Não | reuso detectado revoga a family inteira | `services/refresh.rs:114` | sem env | struct | `src/config.rs` → `RefreshTokenConfig::default` |
|
|
71
|
+
|
|
72
|
+
### 2.3 Política de senha
|
|
73
|
+
|
|
74
|
+
> Diferença deliberada (Confirmado, comentário em `PasswordConfig::default`): os defaults do crate são **rígidos**; os do módulo Java (`microprofile-config.properties`) são permissivos (`min-size=1`, `max-history=0`, flags `false`).
|
|
75
|
+
|
|
76
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
77
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
78
|
+
| `SECURITY_PASSWORD_MIN_SIZE` → `password.min_length` | `usize` | inteiro ≥ 0 | `8` | Não | tamanho mínimo | `services/users.rs` (`validate_password`) | Java: `seedgrid.security.password.min-size` (Java módulo: 1) | boot | `src/config.rs` → `from_env` |
|
|
79
|
+
| `SECURITY_PASSWORD_EXPIRATION_DAYS` → `password.expiry_days` | `i64` | inteiro; `0` = nunca | `0` | Não | data de expiração da senha | `services/users.rs` | Java: `...password.expiration-days` | boot | idem |
|
|
80
|
+
| `SECURITY_PASSWORD_MAX_HISTORY` → `password.history_size` | `usize` | inteiro | `5` | Não | senhas anteriores proibidas | `services/users.rs` | Java: `...password.max-history` (Java módulo: 0) | boot | idem |
|
|
81
|
+
| `SECURITY_PASSWORD_UPPER` → `password.require_upper` | `bool` | `parse_bool` | `true` | Não | exige maiúscula | `services/users.rs` | Java: `...password.upper-case-required` (Java módulo: false) | boot | idem |
|
|
82
|
+
| `SECURITY_PASSWORD_LOWER` → `password.require_lower` | `bool` | `parse_bool` | `true` | Não | exige minúscula | idem | Java: `...lower-case-required` | boot | idem |
|
|
83
|
+
| `SECURITY_PASSWORD_SPECIAL` → `password.require_special` | `bool` | `parse_bool` | `true` | Não | exige especial de `!@#$%^&*(),.?":{}\|<>` | idem | Java: `...special-character-required` | boot | idem |
|
|
84
|
+
| `SECURITY_PASSWORD_NO_REPEAT` → `password.prohibit_repeated_sequence` | `bool` | `parse_bool` | `true` | Não | proíbe 2 caracteres iguais seguidos | idem | Java: `...prohibits-repeated-characters-in-sequence` | boot | idem |
|
|
85
|
+
|
|
86
|
+
### 2.4 Criptografia (segredo TOTP e PII) e privacidade
|
|
87
|
+
|
|
88
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
89
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
90
|
+
| 🔒 `SEEDGRID_PRIVACY_CRYPTO_KEY` · aliases `SECURITY_ENCRYPTION_KEY`, `SEEDGRID_SECURITY_ENCRYPTION_KEY` → `encryption.key_b64` | `Option<String>` | base64 de 32 bytes (AES-256) | `None` | Condicional: exigida para 2FA TOTP (cifra do segredo) e para cifra de PII com privacy ligado | precedência na ordem listada; chave inválida faz `build()` falhar | `src/state.rs` (`SecretCipher`, `AesGcmCryptoService`); `services/twofactor.rs` (`cipher`) | Java: `seedgrid.privacy.crypto.key` (Confirmado em `CryptoProvider.CRYPTO_KEY_PROPERTY` da lib privacy) e `seedgrid.security.encryption.key` (`SecurityEncryptionConfig#key`) | boot | `src/config.rs` → `from_env` |
|
|
91
|
+
| `SEEDGRID_PRIVACY_ENCRYPTION_ENABLED` · alias `SECURITY_PRIVACY_ENABLED` → `privacy.enabled` | `bool` | `parse_bool` | `false` | Não | liga a cifra at-rest de PII (`email`, `whatsApp`, `cnpj`, `rep_*`) e os hashes de busca — só se as chaves existirem | `src/state.rs` (gate de `field_cipher`/`search_hasher`) | Java: `seedgrid.privacy.encryption.enabled` | boot | idem |
|
|
92
|
+
| 🔒 `SEEDGRID_PRIVACY_SEARCH_KEY` · alias `SECURITY_PRIVACY_HMAC_KEY` → `privacy.hmac_key_b64` | `Option<String>` | base64 (≥ 32 bytes, segundo README) | `None` | Condicional: necessária para busca por hash com privacy ligado | HMAC-SHA256 dos `*_hash` | `src/state.rs` | Java: `seedgrid.privacy.search.key` | boot | idem |
|
|
93
|
+
|
|
94
|
+
### 2.5 2FA (`seedgrid.security.2f.*`)
|
|
95
|
+
|
|
96
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
97
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
98
|
+
| `SEEDGRID_SECURITY_2F_ENABLED` → `two_factor.enabled` | `bool` | `parse_bool` | `false` | Não | liga o fluxo 2FA no login; `/2f/*` informa `featureEnabled` | `services/auth.rs:130`, `src/routes.rs` | Java: `seedgrid.security.2f.enabled` (`@WithDefault false`, mas o `microprofile-config.properties` do módulo fixa `true` — **default efetivo é `true` no Java**) | boot | `src/config.rs` → `from_env` |
|
|
99
|
+
| `SEEDGRID_SECURITY_2F_EMAIL_CODE_TTL` → `two_factor.email_code_ttl_seconds` | `i64` (s) | duração | `300` | Não | validade do código por e-mail | `services/twofactor.rs` | Java: `...2f.email.code-ttl` (PT5M) | boot | idem |
|
|
100
|
+
| `SEEDGRID_SECURITY_2F_ALLOWED_METHODS` → `two_factor.allowed_methods` | `Vec<String>` | CSV de `EMAIL`, `TOTP`, `WHATSAPP` | `EMAIL,TOTP` | Não | lista vazia é ignorada | `src/routes.rs` | Java: `...2f.allowed-methods` | boot | idem |
|
|
101
|
+
| `SEEDGRID_SECURITY_2F_DEFAULT_METHOD` → `two_factor.default_method` | `String` | `EMAIL`/`TOTP`/`WHATSAPP` | `TOTP` | Não | método default da sessão 2FA | `services/twofactor.rs` | Java: `...2f.default-method` | boot | idem |
|
|
102
|
+
| `SEEDGRID_SECURITY_2F_TOTP_ISSUER` → `two_factor.totp_issuer` | `String` | qualquer | `SeedGrid` | Não | issuer do `otpauth://` | `services/twofactor.rs` | Java: `...2f.totp.issuer` | boot | idem |
|
|
103
|
+
| `SEEDGRID_SECURITY_2F_TOTP_DIGITS` → `two_factor.totp_digits` | `usize` | inteiro | `6` | Não | dígitos TOTP e dos OTP numéricos | `services/twofactor.rs` | Java: `...2f.totp.digits` | boot | idem |
|
|
104
|
+
| `SEEDGRID_SECURITY_2F_TOTP_PERIOD` → `two_factor.totp_period_seconds` | `u64` | inteiro (s) | `30` | Não | período TOTP | `services/twofactor.rs` | Java: `...2f.totp.period` | boot | idem |
|
|
105
|
+
| `SEEDGRID_SECURITY_2F_VERIFY_MAX_ATTEMPTS` → `two_factor.verify_max_attempts` | `u32` | inteiro | `5` | Não | tentativas por sessão | `services/twofactor.rs:293` | Java: `...2f.verify.max-attempts` | boot | idem |
|
|
106
|
+
| `SEEDGRID_SECURITY_2F_SESSION_TTL` → `two_factor.session_ttl_seconds` | `i64` (s) | duração | `300` | Não | sessão temporária login→verify | `services/twofactor.rs` | Java: `...2f.session.ttl` (PT5M) | boot | idem |
|
|
107
|
+
| `SEEDGRID_SECURITY_2F_WHATSAPP_CHANNEL_ID` → `two_factor.whatsapp_channel_id` | `String` | canal/instância | vazio | Condicional: necessário para oferecer WHATSAPP | vazio → WHATSAPP nunca oferecido; preenchido → `build()` cria `WhatsAppCrateSender` com `seedgrid_whatsapp::WhatsAppConfig::from_env()` | `src/state.rs` (`whatsapp_is_configured`) | Java: `...2f.whatsapp.channel-id` (env Java idêntica). Credenciais do provider: ver [[SeedGrid/Extensions/whatsapp/Configuracao-Rust\|config Rust do whatsapp]] | boot | idem |
|
|
108
|
+
| `SEEDGRID_SECURITY_2F_BACKUP_CODES_COUNT` → `two_factor.backup_codes_count` | `usize` | inteiro | `10` | Não | nº de backup codes gerados | `services/twofactor.rs:615` | Java: `...2f.backup-codes.count` | boot | idem |
|
|
109
|
+
|
|
110
|
+
### 2.6 Frontend (links de e-mail)
|
|
111
|
+
|
|
112
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
113
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
114
|
+
| `SEEDGRID_SECURITY_FRONTEND_BASE_URL` · aliases `SECURITY_FRONTEND_BASE_URL`, `SECURITY_BASE_URL` → `frontend.base_url` | `String` | URL | `http://localhost:3000` | Não (recomendada em produção) | branco ignorado; `/` final removida no uso | `src/web/links.rs` | Java: `seedgrid.security.frontend.base-url` (env idêntica) | boot | `src/config.rs` → `from_env` |
|
|
115
|
+
| `SEEDGRID_SECURITY_FRONTEND_LOGIN_PATH` · alias `SECURITY_FRONTEND_LOGIN_PATH` | `String` | path | `/login` | Não | — | `src/web/links.rs` | Java: `...frontend.login-path` | boot | idem (`fe_env`) |
|
|
116
|
+
| `SEEDGRID_SECURITY_FRONTEND_PASSWORD_RESET_PATH` · alias `SECURITY_FRONTEND_PASSWORD_RESET_PATH` | `String` | path | `/auth/forgot-password/confirm` | Não | — | idem | Java: `...password-reset-path` | boot | idem |
|
|
117
|
+
| `SEEDGRID_SECURITY_FRONTEND_EMAIL_CONFIRMATION_PATH` · alias `SECURITY_FRONTEND_EMAIL_CONFIRMATION_PATH` | `String` | path | `/auth/confirm-email` | Não | — | idem | Java: `...email-confirmation-path` | boot | idem |
|
|
118
|
+
| `SEEDGRID_SECURITY_FRONTEND_WELCOME_PATH` · alias `SECURITY_FRONTEND_WELCOME_PATH` | `String` | path | `/auth/welcome` | Não | — | idem | Java: `...welcome-path` | boot | idem |
|
|
119
|
+
| `SEEDGRID_SECURITY_FRONTEND_SELF_ENTER_PATH` · alias `SECURITY_FRONTEND_SELF_ENTER_PATH` | `String` | path | `/auth/self-enter` | Não | — | idem | Java: `...self-enter-path` | boot | idem |
|
|
120
|
+
|
|
121
|
+
### 2.7 Self-enter (auto-registro e convites)
|
|
122
|
+
|
|
123
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
124
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
125
|
+
| `SECURITY_SELF_ENTER_ENABLED` → `self_enter.enabled` | `bool` | **só** `"true"` literal liga | `false` | Não | desligado → toda rota `/self-enter*` responde 404 (middleware antes da auth) e o cleanup não roda | `src/routes.rs`, `services/selfenter.rs` | Java: `seedgrid.security.self-enter.enabled` | boot | `src/config.rs` → `from_env` |
|
|
126
|
+
| `SECURITY_SELF_ENTER_PUBLIC_ENABLED` → `self_enter.public_enabled` | `bool` | `"true"` literal | `true` | Não | `false` = modo só-convite (signup público 404) | `services/selfenter.rs` | Java: `...self-enter.public-enabled` | boot | idem |
|
|
127
|
+
| `SECURITY_SELF_ENTER_INVITE_ENABLED` → `self_enter.invite_enabled` | `bool` | `"true"` literal | `true` | Não | `false` = convites 404 | idem | Java: `...self-enter.invite-enabled` | boot | idem |
|
|
128
|
+
| `SEEDGRID_SECURITY_SELF_ENTER_REQUEST_TTL` · alias `SECURITY_SELF_ENTER_REQUEST_TTL` → `request_ttl_hours` | `i64` (h) | duração | `48` | Não | convertido para horas (mín. 1) | `services/selfenter.rs` | Java: `...self-enter.request-ttl` (PT48H) | boot | idem |
|
|
129
|
+
| `SEEDGRID_SECURITY_SELF_ENTER_INVITE_TTL` · alias `SECURITY_SELF_ENTER_INVITE_TTL` → `invite_ttl_hours` | `i64` (h) | duração | `168` | Não | idem | idem | Java: `...invite-ttl` (PT168H) | boot | idem |
|
|
130
|
+
| `SEEDGRID_SECURITY_SELF_ENTER_EMAIL_TOKEN_TTL` · alias `SECURITY_SELF_ENTER_EMAIL_TOKEN_TTL` → `otp_ttl_seconds` | `i64` (s) | duração | `1800` | Não | validade de cada OTP de e-mail | idem | Java: `...email-token-ttl` (PT30M) | boot | idem |
|
|
131
|
+
| `SEEDGRID_SECURITY_SELF_ENTER_DEFAULT_ROLE` · alias `SECURITY_SELF_ENTER_DEFAULT_ROLE` → `default_role` | `Option<String>` | nome de role | — (sem padrão) | **Sim, quando `SECURITY_SELF_ENTER_ENABLED=true`**: `SecurityConfig::from_env()` devolve `Err` se ausente/em branco | role atribuída na aprovação quando o convite não traz roles. Busca `SELECT id, for_integration FROM roles WHERE name = $1 AND company_id IS NULL` **antes** de criar o usuário; ausente, inexistente ou de integração → aprovação recusada (`400`, códigos `DEFAULT_ROLE_NOT_CONFIGURED`, `DEFAULT_ROLE_NOT_FOUND`, `ROLE_NOT_ALLOWED`) e nenhum usuário é criado. Roles do convite não encontradas continuam sendo ignoradas | `services/selfenter.rs` (aprovação, `self_enter_default_role`) | Java: `seedgrid.security.self-enter.default-role` (também obrigatória com self-enter ligado). Comportamento equivalente; o Java responde 422/403 onde o Rust responde 400 | boot | idem |
|
|
132
|
+
| `SEEDGRID_SECURITY_SELF_ENTER_CLEANUP_ENABLED` · alias `SECURITY_SELF_ENTER_CLEANUP_ENABLED` → `cleanup_enabled` | `bool` | `parse_bool` | `true` | Não | gate do `cleanup_entry_requests` | `services/selfenter.rs:19` | Java: `...cleanup.enabled` | boot | idem |
|
|
133
|
+
| `SEEDGRID_SECURITY_SELF_ENTER_CLEANUP_PURGE_AFTER` · alias `SECURITY_SELF_ENTER_CLEANUP_PURGE_AFTER` → `purge_after_hours` | `i64` (h) | duração | `168` | Não | retenção de pedidos finalizados | `services/selfenter.rs:32` | Java: `...cleanup.purge-after` (PT168H) | boot | idem |
|
|
134
|
+
| `self_enter.otp_accept_last_n` (campo) | `i64` | — | `4` | Não | aceita os últimos N OTPs válidos | `services/selfenter.rs:210` | sem env | struct | `SelfEnterConfig::default` |
|
|
135
|
+
|
|
136
|
+
O intervalo do job de limpeza **não é config**: o host passa um `Duration` a `spawn_entry_request_cleanup(state, interval)` (`src/lib.rs`). O Java usa `seedgrid.security.self-enter.cleanup.cron`, sem equivalente no crate.
|
|
137
|
+
|
|
138
|
+
### 2.8 Avatar
|
|
139
|
+
|
|
140
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
141
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
142
|
+
| `SEEDGRID_SECURITY_AVATAR_USER_PREFIX` · alias `SECURITY_AVATAR_USER_PREFIX` → `avatar.user_prefix` | `String` | prefixo de storage | `avatars/users` | Não | — | `services/avatar.rs:57` | Java: `seedgrid.security.avatar.user-prefix` | boot | `src/config.rs` → `from_env` |
|
|
143
|
+
| `SEEDGRID_SECURITY_AVATAR_DEFAULT_PREFIX` · alias `SECURITY_AVATAR_DEFAULT_PREFIX` → `avatar.default_prefix` | `String` | prefixo | `avatars/defaults` | Não | pool compartilhado de avatares default | `services/avatar.rs:216` | Java: `...avatar.default-prefix` | boot | idem |
|
|
144
|
+
| `avatar.max_bytes` (campo) | `u64` | bytes; `0` = sem limite | `2097152` via `SecurityConfig::new`/`from_env` (`AvatarConfig::default` = `0`) | Não | rejeita upload maior | `services/avatar.rs:147` | sem env | struct | `SecurityConfig::new` |
|
|
145
|
+
| `avatar.allowed_content_types` (campo) | `Vec<String>` | MIME | `image/png`, `image/jpeg`, `image/webp` via `new` (vazio no `Default` = aceita tudo) | Não | — | `services/avatar.rs:153` | sem env | struct | idem |
|
|
146
|
+
|
|
147
|
+
Backend de storage e credenciais (`seedgrid.security.avatar.storage`, `.filesystem.*`, `.s3.*`, `.minio.*`...) **não** são lidos pelo crate: o host injeta `AvatarStorage` (ex.: `spi::FileManagementStorage`) no builder.
|
|
148
|
+
|
|
149
|
+
### 2.9 Mailer SMTP
|
|
150
|
+
|
|
151
|
+
Auto-ligado no `build()` quando `username` não-branco **e** `password` não-vazio; senão `LoggingEmailService` (só loga). Injeção `.email(...)` do host sempre vence.
|
|
152
|
+
|
|
153
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
154
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
155
|
+
| `SEEDGRID_SECURITY_MAILER_FROM` · alias `SECURITY_MAILER_FROM` | `String` | e-mail | `noreply@example.com` | Não | remetente | `src/email_smtp.rs` | Java: `seedgrid.security.mailer.from` (env idêntica) | boot | `src/config.rs` → `from_env` |
|
|
156
|
+
| `SEEDGRID_SECURITY_MAILER_HOST` · alias `SECURITY_MAILER_HOST` | `String` | host | `smtp.gmail.com` | Não | — | idem | Java: `...mailer.host` | boot | idem |
|
|
157
|
+
| `SEEDGRID_SECURITY_MAILER_PORT` · alias `SECURITY_MAILER_PORT` | `u16` | porta | `587` | Não | inválido ignorado | idem | Java: `...mailer.port` | boot | idem |
|
|
158
|
+
| `SEEDGRID_SECURITY_MAILER_START_TLS` · alias `SECURITY_MAILER_START_TLS` | `String` | `REQUIRED`/`OPTIONAL`/`DISABLED` | `REQUIRED` | Não | `DISABLED` (sem caixa) desliga STARTTLS | `src/email_smtp.rs:36` | Java: `...mailer.start-tls` | boot | idem |
|
|
159
|
+
| `SEEDGRID_SECURITY_MAILER_USERNAME` · alias `SECURITY_MAILER_USERNAME` | `String` | — | vazio | Condicional: necessário para SMTP real | — | `MailerConfig::is_configured` | Java: `...mailer.username` | boot | idem |
|
|
160
|
+
| 🔒 `SEEDGRID_SECURITY_MAILER_PASSWORD` · alias `SECURITY_MAILER_PASSWORD` | `String` | — | vazio | Condicional: idem | sem trim; vazio ignorado | idem | Java: `...mailer.password` | boot | idem |
|
|
161
|
+
|
|
162
|
+
Sem equivalente no crate: `seedgrid.security.mailer.auth-methods` (Java).
|
|
163
|
+
|
|
164
|
+
### 2.10 Atributos adicionais do usuário
|
|
165
|
+
|
|
166
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
167
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
168
|
+
| `SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_SIZE_BYTES` · alias `SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_SIZE_BYTES` | `usize` | inteiro | `16384` | Não | excedeu → 400 `INVALID_USER_ADDITIONAL_ATTRIBUTES` | `services/user_attributes.rs` (`check_limits`) | Java: `seedgrid.security.user.additional-attributes.max-size-bytes`. **Atenção:** o microprofile do módulo Java usa a env `SEEDGRID_SECURITY_USER_ATTRIBUTES_MAX_SIZE_BYTES` (sem `ADDITIONAL_`), que o crate **não lê**; o nome do crate coincide com a regra automática MicroProfile da propriedade | boot | `src/config.rs` → `from_env` |
|
|
169
|
+
| `SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_DEPTH` · alias `SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_DEPTH` | `usize` | inteiro (raiz = 1) | `5` | Não | idem | idem | Java: `...max-depth` (env Java `SEEDGRID_SECURITY_USER_ATTRIBUTES_MAX_DEPTH`) | boot | idem |
|
|
170
|
+
| `SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_KEYS` · alias `SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_KEYS` | `usize` | inteiro | `100` | Não | idem | idem | Java: `...max-keys` (env Java `SEEDGRID_SECURITY_USER_ATTRIBUTES_MAX_KEYS`) | boot | idem |
|
|
171
|
+
|
|
172
|
+
### 2.11 Bootstrap: primeiro admin e empresa-plataforma
|
|
173
|
+
|
|
174
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
175
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
176
|
+
| `SEEDGRID_SECURITY_FIRST_ADMIN_USER_EMAIL` · alias `SECURITY_FIRST_ADMIN_EMAIL` | `Option<String>` | e-mail | `None` | Não | se setado, `bootstrap()` cria/garante o admin | `services/bootstrap.rs` | Java: `seedgrid.security.first-admin-user.email`; também lida diretamente pelo `login-tenancy::assemble_all` | boot | `src/config.rs` → `from_env` (`first_env`) |
|
|
177
|
+
| `SEEDGRID_SECURITY_FIRST_ADMIN_USER_NAME` · alias `SECURITY_FIRST_ADMIN_NAME` | `Option<String>` | — | `None` (bootstrap usa `Administrador`) | Não | — | idem | Java: `...first-admin-user.name` | boot | idem |
|
|
178
|
+
| `SEEDGRID_SECURITY_FIRST_ADMIN_USER_WHATSAPP` · alias `SECURITY_FIRST_ADMIN_WHATSAPP` | `Option<String>` | — | `None` | Não | — | idem | Java: `...first-admin-user.whatsapp` | boot | idem |
|
|
179
|
+
| 🔒 `SEEDGRID_SECURITY_FIRST_ADMIN_USER_INITIAL_PASSWORD` · alias `SECURITY_FIRST_ADMIN_INITIAL_PASSWORD` | `Option<String>` | — | `None` | Não | senha inicial (com `change_password_required`) | `services/bootstrap.rs:232` | Java: `...first-admin-user.initial-password` | boot | idem |
|
|
180
|
+
| `SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ` · alias `SECURITY_DEFAULT_COMPANY_CNPJ` | `String` | CNPJ (comparado só por dígitos) | vazio | Condicional: sem ele não há empresa-plataforma (bootstrap não cria company; `require_platform_scope` sem referência) | — | `services/bootstrap.rs`, `services/rbac.rs`, `services/session.rs`, `services/auth.rs`, `services/platform_company.rs`; lido também por `login-tenancy::assemble_all` | Java: `seedgrid.security.default-company.cnpj` | boot | idem |
|
|
181
|
+
| `SEEDGRID_SECURITY_DEFAULT_COMPANY_CORPORATE_NAME` | `String` | — | vazio | Condicional: obrigatório quando o CNPJ está setado e a company ainda não existe (senão `bootstrap` retorna erro) | — | `services/bootstrap.rs:32` | Java: `...default-company.corporate-name` | boot | idem |
|
|
182
|
+
| `SEEDGRID_SECURITY_DEFAULT_COMPANY_TRADE_NAME` | `String` | — | vazio | Condicional: idem | — | `services/bootstrap.rs:33` | Java: `...default-company.trade-name` | boot | idem |
|
|
183
|
+
| `SecurityOverrides.run_bootstrap` (campo) | `bool` | — | `true` em `SecurityOverrides::enabled()`; `false` em `Default` (derive) | Não | roda `bootstrap()` no fim do `SecurityPlatform::assemble` | `src/platform.rs` | Java tem `seedgrid.security.bootstrap.enabled` (env `SEEDGRID_SECURITY_BOOTSTRAP_ENABLED`), **não lida** pelo crate | struct | `src/platform.rs` |
|
|
184
|
+
|
|
185
|
+
### 2.12 Gestão pela conta e templates
|
|
186
|
+
|
|
187
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Leitura | Origem |
|
|
188
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
189
|
+
| `SEEDGRID_SECURITY_ACCOUNT_ASSIGNABLE_PERMISSION_AUDIENCES` → `account.assignable_permission_audiences` | `Vec<String>` | CSV de audiences | vazio (só permissões sem audience). O `login-tenancy::assemble_all` usa `client` quando a env **não existe** | Não | audiences que o admin da conta pode atribuir em `/me/security/roles` | `services/company_roles.rs` | Java: `seedgrid.security.account.assignable-permission-audiences`. Constante `config::ACCOUNT_ASSIGNABLE_PERMISSION_AUDIENCES_ENV` | boot | `src/config.rs` → `from_env` |
|
|
190
|
+
| `SEEDGRID_SECURITY_TEMPLATES_DIR` · alias `SECURITY_TEMPLATES_DIR` | caminho | diretório | `./templates/security` (relativo ao cwd) | Não | overrides `<nome>.html`/`.txt` vencem os templates embutidos; só usado se o host não injetar `.template_provider(...)` | `DefaultTemplateSecurityProvider::with_host_dir` | sem propriedade Java (Java usa recurso de classpath `templates/security/`) | build | `src/state.rs` → `SecurityStateBuilder::build` |
|
|
191
|
+
|
|
192
|
+
## 3. Propriedades de frameworks/bibliotecas
|
|
193
|
+
|
|
194
|
+
- O crate **não** lê `quarkus.*`, `mp.*`, `smallrye.*`.
|
|
195
|
+
- `seedgrid_whatsapp::WhatsAppConfig::from_env()` é chamado no `build()` quando `SEEDGRID_SECURITY_2F_WHATSAPP_CHANNEL_ID` está preenchido: as envs `SEEDGRID_WHATSAPP_*` pertencem ao crate whatsapp — ver [[SeedGrid/Extensions/whatsapp/Configuracao-Rust|Configuração Rust do whatsapp]].
|
|
196
|
+
- Rate limit das rotas públicas: o `RateLimitService` é construído com `EmptyConfigSource` (`src/ratelimit.rs` → `build_service`), ou seja, **não há override por config** dos limites (login 100/min, auth-refresh 30/min, auth-confirm-email 10/min, forgot-password 5/h, auth-reset-password 10/min, 2fa-verify 5/15min). As propriedades Java `seedgrid.security.rate-limit.login.*` não têm equivalente.
|
|
197
|
+
- `DATABASE_URL`/pool: responsabilidade do host (o crate recebe um `PgPool`).
|
|
198
|
+
|
|
199
|
+
## 4. Propriedades usadas só em testes e exemplos
|
|
200
|
+
|
|
201
|
+
- `tests/common/mod.rs` → `base_config()` monta `SecurityConfig` à mão (chaves de `tests/keys/*.pem`), espelhando a política de senha do `application.properties` de teste Java.
|
|
202
|
+
- `README` do crate: `DOCKER_HOST`, `TESTCONTAINERS_RYUK_DISABLED` (execução dos testes de integração com Podman).
|
|
203
|
+
- Exemplos `rust/examples/seedgrid-security-apikeys-example` e `seedgrid-login-tenancy-example` (`.env.example`): `DATABASE_URL`, `BIND_ADDR` (lidos pelo `main.rs` do exemplo), `SECURITY_JWT_ISSUER`, `SECURITY_JWT_TTL_SECONDS`, `SECURITY_ENCRYPTION_KEY` e `SECURITY_FRONTEND_BASE_URL`.
|
|
204
|
+
|
|
205
|
+
## 5. Aliases, obsoletas, renomeações
|
|
206
|
+
|
|
207
|
+
| Nome atual (primário) | Alias aceito | Observação |
|
|
208
|
+
|---|---|---|
|
|
209
|
+
| `SEEDGRID_SECURITY_JWT_{PRIVATE,PUBLIC}_KEY_LOCATION` | `SECURITY_{PRIVATE,PUBLIC}_KEY_LOCATION` | alias = nome dos exemplos Java |
|
|
210
|
+
| `SECURITY_JWT_{PRIVATE,PUBLIC}_KEY_PEM_FILE` | — | nome antigo do crate, 4ª fonte |
|
|
211
|
+
| `SECURITY_JWT_TTL` | `SECURITY_JWT_TTL_SECONDS` | compat; inteiro em segundos |
|
|
212
|
+
| `SEEDGRID_PRIVACY_CRYPTO_KEY` | `SECURITY_ENCRYPTION_KEY`, `SEEDGRID_SECURITY_ENCRYPTION_KEY` | — |
|
|
213
|
+
| `SEEDGRID_PRIVACY_ENCRYPTION_ENABLED` | `SECURITY_PRIVACY_ENABLED` | — |
|
|
214
|
+
| `SEEDGRID_PRIVACY_SEARCH_KEY` | `SECURITY_PRIVACY_HMAC_KEY` | — |
|
|
215
|
+
| `SEEDGRID_SECURITY_FRONTEND_BASE_URL` | `SECURITY_FRONTEND_BASE_URL`, `SECURITY_BASE_URL` | — |
|
|
216
|
+
| `SEEDGRID_SECURITY_FRONTEND_*`, `_SELF_ENTER_*`, `_AVATAR_*`, `_MAILER_*`, `_USER_ADDITIONAL_ATTRIBUTES_*`, `_TEMPLATES_DIR` | o mesmo nome sem `SEEDGRID_` | — |
|
|
217
|
+
| `SEEDGRID_SECURITY_FIRST_ADMIN_USER_{EMAIL,NAME,WHATSAPP,INITIAL_PASSWORD}` | `SECURITY_FIRST_ADMIN_{EMAIL,NAME,WHATSAPP,INITIAL_PASSWORD}` | alias **sem** `_USER` |
|
|
218
|
+
| `SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ` | `SECURITY_DEFAULT_COMPANY_CNPJ` | corporate/trade name sem alias |
|
|
219
|
+
|
|
220
|
+
Defaults diferentes do módulo Java (Confirmado): issuer (`seedgrid` × `https://seedgrid.com.br`), kid (`None` × `seedgrid-key`), política de senha (rígida × permissiva), `2f.enabled` efetivo (`false` × `true`).
|
|
221
|
+
|
|
222
|
+
## 6. Configuração mínima (`.env`)
|
|
223
|
+
|
|
224
|
+
```dotenv
|
|
225
|
+
# Chaves RSA (obrigatório). Escolha UMA forma por chave.
|
|
226
|
+
SEEDGRID_SECURITY_JWT_PRIVATE_KEY_LOCATION=./keys/private.pem
|
|
227
|
+
SEEDGRID_SECURITY_JWT_PUBLIC_KEY_LOCATION=./keys/public.pem
|
|
228
|
+
# Empresa-plataforma (recomendado; corporate/trade obrigatórios na 1ª criação)
|
|
229
|
+
SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ=<cnpj-da-plataforma>
|
|
230
|
+
SEEDGRID_SECURITY_DEFAULT_COMPANY_CORPORATE_NAME=<razao-social>
|
|
231
|
+
SEEDGRID_SECURITY_DEFAULT_COMPANY_TRADE_NAME=<nome-fantasia>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## 7. Configuração completa comentada
|
|
235
|
+
|
|
236
|
+
```dotenv
|
|
237
|
+
# --- JWT ---
|
|
238
|
+
# Precedência por chave: *_BASE64 (DER) > *_LOCATION (arquivo) > SECURITY_JWT_*_PEM (inline) > SECURITY_JWT_*_PEM_FILE
|
|
239
|
+
SEEDGRID_SECURITY_JWT_PRIVATE_KEY_BASE64=<SEGREDO:jwt-private-key-der-base64>
|
|
240
|
+
SEEDGRID_SECURITY_JWT_PUBLIC_KEY_BASE64=<jwt-public-key-der-base64>
|
|
241
|
+
SECURITY_JWT_ISSUER=https://auth.example.com # default do crate: seedgrid
|
|
242
|
+
SECURITY_JWT_KID=seedgrid-key # default: sem kid
|
|
243
|
+
SECURITY_JWT_TTL=PT8H # ou SECURITY_JWT_TTL_SECONDS=28800
|
|
244
|
+
# --- Refresh ---
|
|
245
|
+
SECURITY_REFRESH_TOKEN_TTL=P30D
|
|
246
|
+
SECURITY_REFRESH_TOKEN_REUSE_GRACE_WINDOW=PT30S # PT0S desliga
|
|
247
|
+
# --- Senha (defaults do crate: 8 / 0 / 5 / true x4) ---
|
|
248
|
+
SECURITY_PASSWORD_MIN_SIZE=8
|
|
249
|
+
SECURITY_PASSWORD_EXPIRATION_DAYS=0
|
|
250
|
+
SECURITY_PASSWORD_MAX_HISTORY=5
|
|
251
|
+
SECURITY_PASSWORD_UPPER=true
|
|
252
|
+
SECURITY_PASSWORD_LOWER=true
|
|
253
|
+
SECURITY_PASSWORD_SPECIAL=true
|
|
254
|
+
SECURITY_PASSWORD_NO_REPEAT=true
|
|
255
|
+
# --- Cripto / privacidade ---
|
|
256
|
+
SEEDGRID_PRIVACY_CRYPTO_KEY=<SEGREDO:aes256-key-base64>
|
|
257
|
+
SEEDGRID_PRIVACY_ENCRYPTION_ENABLED=false
|
|
258
|
+
SEEDGRID_PRIVACY_SEARCH_KEY=<SEGREDO:hmac-key-base64>
|
|
259
|
+
# --- 2FA ---
|
|
260
|
+
SEEDGRID_SECURITY_2F_ENABLED=false
|
|
261
|
+
SEEDGRID_SECURITY_2F_ALLOWED_METHODS=EMAIL,TOTP
|
|
262
|
+
SEEDGRID_SECURITY_2F_DEFAULT_METHOD=TOTP
|
|
263
|
+
SEEDGRID_SECURITY_2F_TOTP_ISSUER=SeedGrid
|
|
264
|
+
SEEDGRID_SECURITY_2F_TOTP_DIGITS=6
|
|
265
|
+
SEEDGRID_SECURITY_2F_TOTP_PERIOD=30
|
|
266
|
+
SEEDGRID_SECURITY_2F_VERIFY_MAX_ATTEMPTS=5
|
|
267
|
+
SEEDGRID_SECURITY_2F_SESSION_TTL=PT5M
|
|
268
|
+
SEEDGRID_SECURITY_2F_EMAIL_CODE_TTL=PT5M
|
|
269
|
+
SEEDGRID_SECURITY_2F_BACKUP_CODES_COUNT=10
|
|
270
|
+
SEEDGRID_SECURITY_2F_WHATSAPP_CHANNEL_ID= # preencher liga WHATSAPP (+ SEEDGRID_WHATSAPP_*)
|
|
271
|
+
# --- Frontend ---
|
|
272
|
+
SEEDGRID_SECURITY_FRONTEND_BASE_URL=https://app.example.com
|
|
273
|
+
SEEDGRID_SECURITY_FRONTEND_LOGIN_PATH=/login
|
|
274
|
+
SEEDGRID_SECURITY_FRONTEND_PASSWORD_RESET_PATH=/auth/forgot-password/confirm
|
|
275
|
+
SEEDGRID_SECURITY_FRONTEND_EMAIL_CONFIRMATION_PATH=/auth/confirm-email
|
|
276
|
+
SEEDGRID_SECURITY_FRONTEND_WELCOME_PATH=/auth/welcome
|
|
277
|
+
SEEDGRID_SECURITY_FRONTEND_SELF_ENTER_PATH=/auth/self-enter
|
|
278
|
+
# --- Self-enter ---
|
|
279
|
+
SECURITY_SELF_ENTER_ENABLED=false # só "true" literal liga
|
|
280
|
+
SECURITY_SELF_ENTER_PUBLIC_ENABLED=true
|
|
281
|
+
SECURITY_SELF_ENTER_INVITE_ENABLED=true
|
|
282
|
+
SEEDGRID_SECURITY_SELF_ENTER_REQUEST_TTL=PT48H
|
|
283
|
+
SEEDGRID_SECURITY_SELF_ENTER_INVITE_TTL=PT168H
|
|
284
|
+
SEEDGRID_SECURITY_SELF_ENTER_EMAIL_TOKEN_TTL=PT30M
|
|
285
|
+
SEEDGRID_SECURITY_SELF_ENTER_DEFAULT_ROLE=<NOME-DA-ROLE-GLOBAL> # obrigatória se SECURITY_SELF_ENTER_ENABLED=true
|
|
286
|
+
SEEDGRID_SECURITY_SELF_ENTER_CLEANUP_ENABLED=true
|
|
287
|
+
SEEDGRID_SECURITY_SELF_ENTER_CLEANUP_PURGE_AFTER=PT168H
|
|
288
|
+
# --- Avatar (prefixos; backend via AvatarStorage injetado) ---
|
|
289
|
+
SEEDGRID_SECURITY_AVATAR_USER_PREFIX=avatars/users
|
|
290
|
+
SEEDGRID_SECURITY_AVATAR_DEFAULT_PREFIX=avatars/defaults
|
|
291
|
+
# --- Mailer (SMTP real liga com username+password) ---
|
|
292
|
+
SEEDGRID_SECURITY_MAILER_FROM=noreply@example.com
|
|
293
|
+
SEEDGRID_SECURITY_MAILER_HOST=smtp.example.com
|
|
294
|
+
SEEDGRID_SECURITY_MAILER_PORT=587
|
|
295
|
+
SEEDGRID_SECURITY_MAILER_START_TLS=REQUIRED
|
|
296
|
+
SEEDGRID_SECURITY_MAILER_USERNAME=<usuario-smtp>
|
|
297
|
+
SEEDGRID_SECURITY_MAILER_PASSWORD=<SEGREDO:smtp-password>
|
|
298
|
+
# --- additionalAttributes ---
|
|
299
|
+
SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_SIZE_BYTES=16384
|
|
300
|
+
SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_DEPTH=5
|
|
301
|
+
SEEDGRID_SECURITY_USER_ADDITIONAL_ATTRIBUTES_MAX_KEYS=100
|
|
302
|
+
# --- Bootstrap ---
|
|
303
|
+
SEEDGRID_SECURITY_FIRST_ADMIN_USER_EMAIL=admin@example.com
|
|
304
|
+
SEEDGRID_SECURITY_FIRST_ADMIN_USER_NAME=Administrador
|
|
305
|
+
SEEDGRID_SECURITY_FIRST_ADMIN_USER_WHATSAPP=
|
|
306
|
+
SEEDGRID_SECURITY_FIRST_ADMIN_USER_INITIAL_PASSWORD=<SEGREDO:first-admin-password>
|
|
307
|
+
SEEDGRID_SECURITY_DEFAULT_COMPANY_CNPJ=<cnpj>
|
|
308
|
+
SEEDGRID_SECURITY_DEFAULT_COMPANY_CORPORATE_NAME=<razao-social>
|
|
309
|
+
SEEDGRID_SECURITY_DEFAULT_COMPANY_TRADE_NAME=<nome-fantasia>
|
|
310
|
+
# --- Conta / templates ---
|
|
311
|
+
SEEDGRID_SECURITY_ACCOUNT_ASSIGNABLE_PERMISSION_AUDIENCES=
|
|
312
|
+
SEEDGRID_SECURITY_TEMPLATES_DIR=./templates/security
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## 8. Receitas
|
|
316
|
+
|
|
317
|
+
- **Chave em uma linha (PaaS):** use `SEEDGRID_SECURITY_JWT_PRIVATE_KEY_BASE64`/`_PUBLIC_KEY_BASE64` com o corpo DER (sem `-----BEGIN`). É a mesma env do Java.
|
|
318
|
+
- **Mesmo `dev.env` do Java:** os nomes `SEEDGRID_SECURITY_*` do módulo funcionam, **exceto** issuer/kid/ttl do JWT (use `SECURITY_JWT_ISSUER`/`_KID`/`_TTL`) e os limites de `additionalAttributes` (Java usa `..._USER_ATTRIBUTES_...`, crate usa `..._USER_ADDITIONAL_ATTRIBUTES_...`).
|
|
319
|
+
- **Política de senha igual à do Java (permissiva):** `SECURITY_PASSWORD_MIN_SIZE=1`, `SECURITY_PASSWORD_MAX_HISTORY=0`, `SECURITY_PASSWORD_UPPER/LOWER/SPECIAL/NO_REPEAT=false`.
|
|
320
|
+
- **E-mail real:** defina `SEEDGRID_SECURITY_MAILER_USERNAME` + `_PASSWORD`; sem eles o crate só loga.
|
|
321
|
+
- **2FA por WhatsApp:** `SEEDGRID_SECURITY_2F_ALLOWED_METHODS=EMAIL,TOTP,WHATSAPP` + `SEEDGRID_SECURITY_2F_WHATSAPP_CHANNEL_ID` + credenciais `SEEDGRID_WHATSAPP_*`.
|
|
322
|
+
- **Self-enter só por convite:** `SECURITY_SELF_ENTER_ENABLED=true`, `SECURITY_SELF_ENTER_PUBLIC_ENABLED=false` (o valor tem de ser exatamente `true` para ligar).
|
|
323
|
+
|
|
324
|
+
## 9. Dúvidas e lacunas
|
|
325
|
+
|
|
326
|
+
- Nomes JWT do módulo Java (`SEEDGRID_SECURITY_JWT_ISSUER/KID/TTL`) não são aceitos; o comentário de `from_env` diz "alinhado aos nomes do Java", o que vale para os exemplos Java, não para o módulo — **Confirmado**.
|
|
327
|
+
- Sem equivalente no crate (Java tem): `seedgrid.security.bootstrap.enabled`, `rate-limit.login.*`, `rbac.cache-ttl` (cache RBAC não implementado), `2f.otp-qrcode.*`, `2f.verify.lockout-duration`, `2f.backup-codes.length`, `2f.whatsapp.code-ttl`, `self-enter.invite-needs-approval`, `self-enter.cleanup.cron`, `self-enter.email.*`, `mailer.auth-methods`, `avatar.storage/public-read/*` (backend) e os campos de endereço/representante de `default-company.*` — **Confirmado** por comparação com `microprofile-config.properties` e `configs/*.java` do Java.
|