Sto scrivendo un Rest API Framework, mi piacerebbe creare un contesto di autorizzazione db. Il contesto accetta un risolutore di ruolo e lo utilizza per filtrare il set predefinito. Base su un insieme di regole.
Nel mio primo tentativo ho pensato che potrei applicare filtri predefiniti ai set di entità per vietare l'accesso a determinate risorse
public class AuthorizationContext : DbContext
{
protected IConstraintResolver _constraintResolver;
public AuthorizationContext(IConstraintResolver constraintResolver)
{
this._constraintResolver = constraintResolver;
}
public override DbSet<TEntity> Set<TEntity>()
{
var defaultSet = base.Set<TEntity>();
var constraints = this._constraintResolver.GetConstraintsForTypeByRole<TEntity>();
var filteredSet = base.Set<TEntity>().AsQueryable();
foreach (var constraint in constraints)
{
filteredSet = filteredSet.Where(constraint);
}
//how do I apply this back to the innerQueryable
return filteredSet;
}
}
ma questo non viene compilato perché non posso trasformare il mio Queryable
in un filteredDBSet
.
Ho trovato alcuni articoli su diversi modi per proteggere i dati in EF-Core, ma l'utilizzo di questo metodo richiederebbe, non è il modo in cui voglio proteggere i miei dati.
Ho una funzione che genera già le mie espressioni in base ai metadati di SQL. Il mio problema sta applicando il filtro ai DBSet
.
Supponendo che ti venga assegnata Expression<TEntity, Bool>
Come posso proteggere il mio contesto in modo che un utente possa solo accedere o modificare i dati che ho deciso?
Expression<TEntity, bool>
sembra un buon candidato per il filtro di query globale EF Core 2.0.
Puoi impostarlo per un'entità specifica:
modelBuilder.Entity<SomeEntity>().HasQueryFilter(expression);
o per più entità basate su alcuni criteri - gli esempi sono EF-Core 2.0 Filtra tutte le query (cercando di ottenere l'eliminazione soft) e ef core 2 applica HasQueryFilter per tutte le entità .
Si noti che attualmente i filtri di query globali hanno alcune limitazioni e requisiti speciali per essere radicati nella classe derivata DbContext
se hanno bisogno di essere dinamici, ecc. ( Nucleo EF: eliminazione morbida con proprietà ombra e filtri di query ). Sono abbastanza sicuro che saranno migliorati nel tempo, ma è bene verificare se la funzionalità corrente può soddisfare le tue esigenze.