Permessi utente dinamici migliori

2

Supporto un sistema ERP interno e un Reporting / Dashboard esterno utilizzati dai nostri clienti che utilizzano entrambi lo stesso database.

Gli utenti normali dell'applicazione interna possono controllare ciò che i clienti possono accedere tramite il cruscotto esterno: possono essere siti, lavori, documenti, ecc. chi può vedere cosa su quali account / siti diventa molto complesso molto rapidamente.

Pertanto utilizziamo una funzione Valore tabella inline per restituire chi può vedere cosa (questo può e cosa cambia abbastanza frequentemente) e unirlo a risorse che possono vedere attraverso un campo comune a tutti i dati.

Questa funzione è chiamata più volte per pagina ed è difficile da memorizzare nella cache; non è insolito che questo set di risultati sia composto da 10k + record (che vengono poi uniti alle risorse e interrogati) sebbene sia veloce.

Una tipica chiamata sarebbe quindi simile a questa:

SELECT top 50 * FROM [dbo].[fn_GetJobsForUser] (CustomerUserId) order by JOBIDNumber desc

Il codice per il quale appare:

    CREATE FUNCTION [dbo].[fn_GetJobsForUser]
        (
        @contactId int
        )
        RETURNS TABLE
        AS
        RETURN
    (
        SELECT 
            -- ...
        FROM cd_Job (NOLOCK) jobs
            inner join dbo.fn_GetUserPermissions(@contactId) usr on jobs.CommonField = usr.CommonField 

) 

Questo ha funzionato bene finora, anche se è sempre stato lento quando si avvia da un avvio a freddo quando un cliente effettua il login (lo mascheriamo con una schermata di caricamento).

Il problema è che occasionalmente scade il tempo in cui i clienti hanno un numero elevato di record restituiti dalla query dei permessi.

Sto quindi cercando un approccio migliore, in sintesi:

  • Dobbiamo consentire agli utenti interni di fornire autorizzazioni ai clienti esterni e di applicarli immediatamente
  • Le autorizzazioni sono complesse e il set di risultati può contenere oltre 18k di record
  • Non ci sono indici mancanti e il 99% delle volte tutto scorre liscio
  • Funziona male per i grandi clienti con un gran numero di permessi
  • Non riesco a vedere come i ruoli migliorerebbero le cose, la maggior parte degli utenti ha gli stessi livelli di autorizzazione ma può vedere solo i dati che li riguardano e questo è arbitrariamente impostato da un utente interno. Nuovi dati e risorse vengono aggiunti su base giornaliera.

Se fa differenza, il nostro stack è SQL Server (2008) & C # MVC5 utilizzando Entity Framework

Questo non può essere un nuovo problema, qualcuno ha qualche indicazione su un approccio migliore?

    
posta SWa 10.05.2016 - 12:59
fonte

0 risposte

Leggi altre domande sui tag