SmartExchange · .NET 10 · Chapter 07
Intaker and Web API integration
Rovnaký Reader → Resolver → Client → SQL adapter slúži obom aplikáciám. Aplikačná zostáva iba stavba query a riadenie operácie.
Už zapojené v kóde Intakera
// OnMessageAxtionExportXlsx · current source excerpts
authorizationMapping = ExportAuthorizationResourceCatalog.GetMapping(
importTemplateSheet.IntakeSheet);
var reader = new LegacySqlAuthorizationGrantAdapter(
(System.Data.Common.DbConnection)kata.Db.Connection, msg.Header.Product);
IAuthorizationContextResolver resolver =
new SmartExchangeAuthorizationContextResolver(reader);
var principal = await resolver.ResolveAsync(
new(userId, msg.Header.Product, authorizationMapping.ResourceKind));
authorizationPlan = await exportAuthorizationClient.PlanResourcesAsync(new(
requestId, principal,
new AuthorizationResource { Kind = authorizationMapping.ResourceKind },
"export"));
// After PrepareQueryForExport; before filters, paging and Execute:
exportQueryBuilder.ApplyAuthorizationPlan(
authorizationPlan, authorizationMapping,
new SqlKataAuthorizationQueryAdapter());MicroApplication.AuthorizeExports je prepínač aplikácie, aktuálne predvolene true. Handler vyžaduje ActionBy a používa databázu vybranú pre Header.Product. Loguje request/decision IDs a AlwaysDenied odmietne ešte pred vykonaním query.
ExportAuthorizationResourceCatalog.GetMapping(intakeSheet) nájde CRM entitu a GUID kľúč, potom zavolá spoločnú factory/registry. Aktuálny kód používa Company na nájdenie CRM assembly; nemá switch vzťahov pre jednotlivé entity. ExportQueryBuilder.ApplyAuthorizationPlan() iba zavolá adapter.Apply().
Jedna integrácia pre oba resources
// resourceKind, action, policyVersion and rootIdColumn are server-owned.
// The database connection must match the authenticated product instance.
var reader = new LegacySqlAuthorizationGrantAdapter(connection, product);
var resolver = new SmartExchangeAuthorizationContextResolver(reader);
var principal = await resolver.ResolveAsync(
new(userId, product, resourceKind), cancellationToken);
var plan = await policyClient.PlanResourcesAsync(new(
requestId, principal,
new AuthorizationResource { Kind = resourceKind, PolicyVersion = policyVersion },
action), cancellationToken);
var mapping = AuthorizationSqlMappingFactory.Create(
resourceKind, action,
new AuthorizationSqlAttribute(rootIdColumn, AuthorizationSqlValueType.Guid),
SmartExchangeAuthorizationRelationshipRegistry.GetRelationships(resourceKind));
query = queryAdapter.Apply(query, plan, mapping);
// Then count/page/execute; never ignore an authorization failure.| Parameter operácie | Person export | InterestedParty export |
|---|---|---|
| resourceKind / action | Person / export | InterestedParty / export |
| rootIdColumn | Person.Id | InterestedParty.Id |
| Demo policy verzia | presentation-demo | presentation-demo |
| Vzťah určený spoločnými metadátami | companyIds → Company | projectIds → Project |
Intaker už vyberá resource z template a plánuje export. API dodá vlastný query alias a action. Ani jeden nepotrebuje samostatný Person/InterestedParty autorizačný kód. Demo policies nie sú nasadené; reálna aplikácia dnes predvolene používa policy verziu default.
Konkrétny záznam: zostávajúca spoločná práca
Cerbos CheckResources je dostupné a Project Scope policy sme cez neho overili. Naše IAuthorizationPolicyClient zatiaľ ponúka iba PlanResources; spoločný CheckResources kontrakt a klientská metóda chýbajú.
Spoločný resource-attribute provider musí načítať dôveryhodné fakty, napríklad projectIds pre InterestedParty alebo companyIds pre Person. Najprv určime atribúty podľa resource; neskôr ich môžeme zúžiť podľa action pre jednoduchšie read/update/delete query. Provider je navrhnutý, nie implementovaný.