Progettazione di un'applicazione a singola pagina multi-tenant per il web

2

Sto cercando di progettare un'applicazione multi-tenant (beh, credo che sia multi-tenant). Abbiamo un'applicazione a singola pagina, un'API e un database comune.

Abbiamo gruppi di utenti, ciascuno con i propri requisiti leggermente diversi. Un utente non può essere in più di un gruppo al momento .

Le caratteristiche principali che abbiamo sono:

  • Ricerca: campi di ricerca che variano per gruppo di utenti
  • Griglia: colonne che variano per gruppo di utenti
  • pannello Dettagli: campi variabili da mostrare per il risultato

Ci sono alcune proprietà comuni in ogni funzione chiave sopra, ma alcune sono completamente uniche per ciascun gruppo.

Ho due considerazioni principali qui:

  1. Gestione delle visualizzazioni dell'interfaccia utente per gruppo di utenti
  2. Pubblicando e restituendo al front-end un oggetto con solo le proprietà richieste.

Utilizziamo TypeScript + Angular 1 per il front-end e .NET Web API per il back-end.

Voglio evitare:

  • Oggetti di Dio che contengono tutte le proprietà per tutti i gruppi che vanno avanti e indietro sul filo.
  • Un sacco di se le istruzioni sono disseminate nel codice front-end per mostrare e nascondere in base al gruppo di utenti.

Con questo in mente, il design attuale che sto considerando è il seguente:

  • Carica diverse visualizzazioni per gruppo al momento del caricamento dell'applicazione front-end
  • Collega diversi controller in base alla vista
  • Attualmente, questo significa che il pacchetto di JS per tutti i gruppi verrà servito al client
  • Ciò significa che possiamo avere endpoint specifici per la stessa operazione, che contengono oggetti di richiesta specifici e restituiscono oggetti specifici.
  • Dal punto di vista della struttura di una cartella, separa per caratteristica del codice, quindi raggruppa se è diverso.

I vantaggi di questo sono:

  • Il codice specifico per un gruppo è facile da ragionare quando differisce
  • Pubblicare e ricevere solo ciò che è rilevante per l'utente.
  • Se un utente appartiene a più gruppi, possiamo fornire loro una funzionalità per passare tra le mini-applicazioni cambiando il gruppo attivo in cui si trovano.

Gli svantaggi di questo sono:

  • Molto più plumbing sul caricamento delle viste e dei controller dipendenti dal gruppo in cui si trova l'utente che ha effettuato l'accesso.
  • Serve tutto il codice dell'applicazione front-end per tutti i gruppi in primo piano
  • Gestione del deep linking / routing per un gruppo quando un utente appartiene a più gruppi. Suppongo che questo possa essere gestito tramite param querystring. : (

Pensieri?

Aggiornamento 27/07/2017

Quindi, usando un esempio inventato:

I criteri di ricerca variano in base ai diversi campi per gruppo.

  • Group a: Name, Age, DOB, Car type, Car engine size
  • Group b: Name, Age, Shoe size, shirt size, favourite colour

Estrapolando questo, abbiamo 8 gruppi, ognuno con 10 proprietà comuni e 5 proprietà specifiche di gruppo. Il mio enigma è il seguente:

Se vado con un singolo endpoint di ricerca con un oggetto di richiesta che incapsula tutte le proprietà per tutti i gruppi. Quelle sono 50 proprietà (10 proprietà comuni + 5 * 8 gruppo).

Per ogni gruppo dato solo 15 sono rilevanti. Devo rendere il codice lato server per utilizzare solo i 15 appropriati e escludere gli altri 35.

Inoltre, lo stesso si verifica sulla risposta. Riceverò un oggetto di grandi dimensioni, di cui solo un piccolo sottoinsieme contiene dati pertinenti all'utente in quel gruppo, il resto è nullo. Dovrò inserire una quantità sufficiente di istruzioni condizionali per gestire la visualizzazione e nascondere queste cose sul lato front-end.

Probabilmente non è considerato multi-tenant, ma sto cercando di ottenere consigli su un buon design per questo tipo di problema.

    
posta Prabu 26.07.2017 - 18:54
fonte

1 risposta

1

Hai dato pochi dettagli sulla tua base di utenti, ma sembra che tu non abbia un requisito multi-tenant. Ci sono anche alcuni dettagli su come le tue opinioni differiscono tra loro. D'istinto, direi che non hai mutli-tenant, ma in realtà hai più gruppi. Immagino anche che tu ti stia inclinando verso una soluzione che ti farà arrabbiare più tardi con te stesso. Più specificamente, implementazioni separate di ciascuna vista di ricerca, visualizzazione griglia e vista dettagli.

Credo che dovresti usare l'autenticazione utente standard tramite keystone, o keycloak o un'altra terza parte. Approfitta dei loro utenti / gruppi / ruoli per assegnare una gerarchia di permessi. Qualcosa come USER_BASIC_PERM concederebbe loro l'accesso all'ID, al nome e alla categoria di un oggetto. USER_CASH_PERM consentirebbe quindi l'accesso al costo, al valore, al margine di profitto. USER_ADMIN_PERM consente loro di visualizzare i campi relativi all'acquirente di terze parti, l'url all'ordine di acquisto, ecc. Puoi utilizzare i gruppi per mettere insieme più autorizzazioni di ruolo e gestire gli utenti più facilmente con un singolo gruppo.

Quindi puoi costruire le tre viste includendo / escludendo le sotto-viste in base alle autorizzazioni dell'utente. Quando inviano una ricerca, è necessario convalidare i loro campi in base ai rispettivi ruoli sul lato server. Quando si restituiscono i dettagli, è necessario inserirli in un filtro delle autorizzazioni prima di restituirli al client. A lungo termine, questo sarà più facile da gestire rispetto all'implementazione di viste separate per ciascuno dei tuoi inquilini.

Penso che se consideri che sono le uniche autorizzazioni di un utente a fare la differenza, allora vedrai che le principali funzionalità dovrebbero essere autonome. 'search' sarebbe un modulo sul lato server. L'accesso ai dati a griglia sarebbe un altro. Mantenere funzionalità simili insieme sul lato server porterà a una minore ripetizione. Separare server-side per gruppo significherebbe che devi visitare 3 moduli separati per risolvere un bug che copre tutte le tue query di "griglia".

Pensa a lungo termine - se aggiungi altri 5 affittuari molto vicini ai tre che conosci, quale causa causerà meno dolore in seguito.

Supponiamo che tu aggiunga una quarta vista. Vuoi aggiungerlo una volta con i controlli dei permessi, o una volta per ciascuno dei tuoi attuali 8 inquilini - anche se la maggior parte di essi condivide la stessa identica vista?

    
risposta data 26.07.2017 - 21:09
fonte

Leggi altre domande sui tag