Ajout de features
Les systÚmes réels en production ont besoin de plus que des endpoints CRUD générés. Ils ont besoin de sécurité, d'autorisations, de traitement asynchrone, de tùches opérationnelles, de publication d'événements et, dans les scénarios SaaS, d'une isolation par tenant.
Lino ajoute ces features en tant que features standard. Chaque feature met Ă jour les mĂ©tadonnĂ©es du projet, gĂ©nĂšre du code source, ajoute une configuration et maintient le backend, le frontend, la messagerie et la persistance alignĂ©s sur la mĂȘme architecture.
Authentification et autorisation
La fonction d'authentification ajoute la base de sĂ©curitĂ© utilisĂ©e par les projets Lino pour protĂ©ger les API, identifier les utilisateurs, contrĂŽler l'accĂšs aux opĂ©rations et intĂ©grer les mĂȘmes autorisations avec les applications Web Blazor. Il s'installe avec la commande:
lino feature auth add --service <ServiceName> --module <ModuleName>
La commande peut Ă©galement ĂȘtre exĂ©cutĂ©e de maniĂšre interactive avec lino feature auth add.
La branche canonique est feature auth; CLI expose également des alias comme feature security et feature identity.
Dans l'architecture Lino actuelle, l'authentification et l'autorisation reposent sur la messagerie asynchrone. La raison est opérationnelle : les autorisations des services et des modules sont synchronisées par les événements d'intégration, le projet doit donc activer la messagerie avant d'ajouter la sécurité.
Ce que demande le sorcier
CLI valide le projet en cours, vĂ©rifie si la feature n'a pas encore Ă©tĂ© installĂ©e, demande oĂč le module de sĂ©curitĂ© doit ĂȘtre créé et demande les principaux paramĂštres du token.
- Service: service qui hébergera les ressources de sécurité.
- Module: module cible lorsque le service sélectionné est modulaire.
- Durée de vie du jeton d'accÚs: durée de vie, en minutes, des jetons d'accÚs émis.
- Actualiser la durée de vie du jeton: durée de vie des tokens utilisés pour renouveler les sessions.
-
Type d'identifiant utilisateur: type de données utilisées comme identifiant d'utilisateur, telles que
int,longouGuid.
ModÚle de sécurité généré
AprÚs confirmation, Lino met à jour les métadonnées du projet, crée les valeurs de configuration de sécurité, génÚre les fichiers de code source et exécute les commandes nécessaires. Le modÚle généré inclut les entités centrales de sécurité :
Userstocke les identites et les donnees de profil.Roleet des associations de rĂŽles pour regrouper les rĂšgles d'accĂšs.Permissionet les relations entre les rĂŽles et les autorisations pour une autorisation granulaire.UserTokenpour contrĂŽler les jetons d'actualisation et le cycle de vie des jetons.
La feature cree egalement les informations necessaires a la configuration de securite, comme le secret de signature des tokens et les durees de vie de access token et de refresh token. Les valeurs sensibles sont Ă©mises sous forme de commandes vers les secrets utilisateur AppHost, plutĂŽt que d'ĂȘtre Ă©crites directement dans des fichiers versionnĂ©s.
Comportement d'exécution
L'API utilise l'authentification JWT Bearer. L'utilisateur se connecte, reçoit un access token et un refresh token, puis commence Ă envoyer des requĂȘtes Ă l'API avec l'en-tĂȘte Authorization: Bearer <token>.
Le backend valide le jeton, charge le contexte utilisateur et applique les rĂšgles d'autorisation aux endpoints.
Le flux typique reste simple : connexion via un point de terminaison ou une page dédiée, émission de JWT avec des revendications d'identité, des rÎles et des autorisations, envoi du jeton dans chaque demande et validation de la signature et de l'expiration via le middleware d'authentification.
Lino utilise des stratĂ©gies et des autorisations pour implĂ©menter une autorisation granulaire. Chaque action peut nĂ©cessiter une autorisation spĂ©cifique, telle que People.Read ou People.Create; Les politiques peuvent ĂȘtre configurĂ©es via AddAuthorization; et les points finaux peuvent ĂȘtre protĂ©gĂ©s en dĂ©clarant .RequireAuthorization.
Les endpoints et les pages générés utilisent les autorisations de maniÚre cohérente. Les opérations backend peuvent nécessiter des autorisations, tandis que l'interface utilisateur Blazor générée peut charger des autorisations, protéger des pages, masquer les actions indisponibles et exposer des écrans pour les utilisateurs, les rÎles, les autorisations et les autorisations lorsqu'il existe une application Web dans le projet.
Lorsque les tùches en arriÚre-plan sont déjà activées, Lino ajoute également des tùches liées aux jetons utilisateur, telles que des routines de maintenance pour les jetons désactivés ou expirés.
Traitement en arriĂšre-plan et Outbox
Le traitement en arriĂšre-plan gĂšre les tĂąches qui ne doivent pas bloquer le flux principal de requĂȘtes et de rĂ©ponses : publication d'Ă©vĂ©nements d'intĂ©gration, nettoyage d'anciens enregistrements, suppression de jetons expirĂ©s, envoi de notifications, gĂ©nĂ©ration de rapports, synchronisation avec des systĂšmes externes ou exĂ©cution de tĂąches planifiĂ©es. Lino ajoute cette feature via la feature de travail en arriĂšre-plan :
lino feature background-job add --service <ServiceName>
La commande peut Ă©galement ĂȘtre exĂ©cutĂ©e comme lino feature background-job add et complĂ©tĂ© de maniĂšre interactive.
CLI expose les alias comme job-scheduler et worker.
Cette feature nécessite l'activation de la messagerie dans le projet, car sa principale responsabilité est de publier en toute sécurité les messages enregistrés par la norme Transactionnelle Outbox.
Ce que demande le sorcier
- Service: service dans lequel l'infrastructure des jobs en arriÚre-plan sera installée.
- BibliothÚque de tùches en arriÚre-plan: implémentation utilisée pour exécuter et planifier les tùches. L'infrastructure actuellement générée utilise Hangfire.
- Traitement Outbox: définit si le service enregistrera les événements à traiter par le planificateur.
- Planification Outbox: expression de plage ou de planification utilisée pour vérifier les nouveaux messages Outbox.
- Taille du lot: nombre d'enregistrements Outbox récupérés et traités par cycle, contrÎlant la charge, le parallélisme et la consommation des ressources.
Infrastructure Hangfire
Lino génÚre l'infrastructure nécessaire pour enregistrer Hangfire, configurer sa persistance, exposer le tableau de bord et planifier les tùches utilisées par le service. La configuration generee inclut les informations necessaires pour planifier les jobs, traiter les messages Outbox et proteger acces au tableau de bord du planificateur.
Dans les solutions générées, le schéma et les tables Hangfire font partie de la configuration de la base de données de l'application. Le tableau de bord vous aide à inspecter les tùches terminées, échouées, planifiées et récurrentes pendant le développement et l'exploitation.
Les avantages pratiques incluent une exécution fiable de tùches asynchrones, un tableau de bord de surveillance intégré, la prise en charge des tùches récurrentes ou planifiées et la persistance des tùches dans la base de données.
Traitement avec Outbox transactionnel
Pour garantir la cohĂ©rence des intĂ©grations asynchrones, Lino utilise le modĂšle Transactional Outbox. Un cas d'utilisation mĂ©tier conserve les modifications de domaine et enregistre un Ă©vĂ©nement d'intĂ©gration dans la table Outbox au sein de la mĂȘme transaction. Le travail en arriĂšre-plan lit ensuite la table Outbox et publie l'Ă©vĂ©nement via le bus de messages configurĂ©, tel que RabbitMQ avec MassTransit lorsque ces options ont Ă©tĂ© sĂ©lectionnĂ©es pour le projet.
- Une commande modifie l'état du domaine et enregistre ce changement dans une transaction.
- Un gestionnaire enregistre un événement d'intégration dans Outbox, par exemple un événement lié à la création d'une commande.
- Le travail Hangfire bloque un lot de messages non traités et marque ces messages comme étant en cours de traitement.
- Chaque message est désérialisé et publié par le bus d'événements.
- Les messages réussis sont marqués comme traités ; Les messages ayant échoué conservent les informations sur les erreurs pour une analyse ultérieure ou une stratégie de nouvelle tentative.
Le résultat est l'atomicité entre la base de données et les événements enregistrés, la fiabilité afin que les événements ne soient pas perdus en cas de panne et l'évolutivité afin que plusieurs consommateurs traitent les messages publiés.
Le travail généré comprend également des routines pour supprimer les anciens messages Outbox qui ont déjà été traités avec succÚs et libérer les messages bloqués en cours de traitement, réduisant ainsi le risque de verrouillages permanents aprÚs des échecs d'application.
Lorsque l'authentification est installée, la feature de tùche en arriÚre-plan peut également héberger des tùches de maintenance de jetons, gardant ainsi les données de sécurité propres au fil du temps.
Grùce à ces features supplémentaires, Lino offre une sécurité robuste, un contrÎle d'accÚs granulaire et un traitement asynchrone fiable pour les exigences critiques des applications de production modernes.
Multitenancy
La multi-tenancy est la feature utilisĂ©e lorsque la mĂȘme application doit servir plusieurs clients, organisations ou environnements tout en conservant des donnĂ©es, des autorisations et des configurations isolĂ©es pour chaque tenant. Dans Lino, la prise en charge des tenants est ajoutĂ©e avec :
lino feature tenant add --service <ServiceName> --module <ModuleName>
La commande peut Ă©galement ĂȘtre exĂ©cutĂ©e de maniĂšre interactive avec lino feature tenant add.
La branche CLI expose également des alias comme tenancy.
Conditions préalables
La prise en charge des tenants dépend de deux capacités architecturales :
- Authentification et autorisation, car l'accĂšs des utilisateurs, les rĂŽles, les autorisations et les jetons doivent tenir compte des tenants.
- Messagerie, car les informations sur le tenant et l'utilisateur peuvent ĂȘtre propagĂ©es Ă d'autres modules par des Ă©vĂ©nements d'intĂ©gration.
Si ces prĂ©requis sont manquants, la commande est rejetĂ©e. La feature ne peut Ă©galement ĂȘtre installĂ©e quâune seule fois par projet.
Ce qui est généré
Lino crée le modÚle de tenancy, la configuration, les événements, l'intégration API et les ressources frontales nécessaires pour gérer les tenants de maniÚre cohérente.
Tenantstocke identite du tenant, son nom, son slug, son statut, son mode isolation et sa reference de chaine de connexion.TenantBrandingstocke les donnĂ©es de marque pour un comportement visuel spĂ©cifique par tenant.TenantDomainmappe les hĂŽtes ou les domaines aux tenants.TenantStatusetIsolationModedĂ©finir le cycle de vie des tenants et les options dâisolation des donnĂ©es.- La configuration generee prend en charge la resolution des tenants et isolation des donnees du projet.
Sécurité adaptée aux tenants
Tenancy modifie la façon dont l'authentification et l'autorisation sont interprĂ©tĂ©es. Un jeton et une autorisation valides sont Ă©valuĂ©s dans le contexte du tenant actuel ; un utilisateur ayant accĂšs Ă un tenant ne reçoit pas automatiquement l'accĂšs Ă un autre tenant. Par consĂ©quent, la prise en charge des tenants met Ă jour les flux dâauthentification, le comportement du jeton dâactualisation, les autorisations et les rĂ©fĂ©rences gĂ©nĂ©rĂ©es pour lâinterface utilisateur.
Dans les applications Blazor gĂ©nĂ©rĂ©es, des Ă©crans tenant compte des tenants peuvent ĂȘtre ajoutĂ©s pour gĂ©rer les tenants et les flux d'autorisation. Sur le backend, les endpoints gĂ©nĂ©rĂ©s peuvent rĂ©soudre le contexte du tenant Ă partir du comportement configurĂ© de l'hĂŽte, du slug ou de la route, puis appliquer l'identifiant du tenant dans les dĂ©cisions de donnĂ©es et d'autorisation.
Isolation et propagation des données
Lino prend en charge la modélisation de domaine tenant compte des tenants en permettant aux entités de déclarer la propriété par tenant. Dans les scénarios SaaS, cela permet aux tables métier de stocker des données spécifiques au tenant tandis que les modules partagés continuent de recevoir les informations sur le tenant et l'utilisateur dont ils ont besoin.
L'architecture gĂ©nĂ©rĂ©e utilise des Ă©vĂ©nements et le modĂšle Outbox pour propager les donnĂ©es de tenant ou d'utilisateur sĂ©lectionnĂ©es entre les modules sans coupler tous les modules directement aux tables d'identitĂ© ou de tenancy d'origine. Cela maintient les limites des modules claires, tandis que les Ă©crans, les API, les autorisations et les requĂȘtes continuent de fonctionner avec le contexte du tenant.
AprÚs avoir ajouté la tenancy, créez et appliquez les migrations pour le service concerné, examinez les secrets générés et les clés API, exécutez AppHost et validez avec au moins deux tenants pour garantir que les données, les utilisateurs, les rÎles, les autorisations et les enregistrements commerciaux restent isolés.
- Valider l'isolement : créer des tests en essayant d'accéder aux données d'un autre tenant.
- Examiner les autorisations : un utilisateur peut avoir différents rÎles dans différents tenants.
- Ăvitez de faire confiance au client : le tenant informĂ© par route, hĂŽte, slug ou en-tĂȘte doit ĂȘtre compatible avec l'utilisateur authentifiĂ©.
