Nabû 1.0.0
Standardizing .NET developments with abstractions
rights-and-roles

ianchor-autotoc_md12ilinebr

title: Définir des droits et des rôles summary: Créer des droits globaux (Right) et sur une ressource (RightOn<T>), les regrouper en rôles (Role, RoleOn<T>), et remplir les rôles avec RoleFactory et IRightsFactory<TRole>. symbols: [IHumbabaAuthorize, Right, RightOn1, RightOn1.ResourceValue, Role, Role.Rights, Role.UpdateRights, RoleOn1, RoleFactory, RoleFactory.MakeRole, IRightsFactory1, IRightsFactory`1.GetRights]

order: 1

Droits

Un droit dérive de Right (global) ou de RightOn<T> (sur une ressource de type T, identifiée par une chaîne dans ResourceValue). Les deux méthodes Instantiate sont abstraites : Instantiate(string?) doit reporter la ressource, c'est elle qu'appellent le service et les attributs pour fabriquer l'exigence.

public class AccesAdmin : Right
{
public override IHumbabaAuthorize Instantiate() => new AccesAdmin();
public override IHumbabaAuthorize Instantiate(string? v) => new AccesAdmin();
}
public class AccesAgence : RightOn<Agence> // T sert de type de ressource (son FullName)
{
public override IHumbabaAuthorize Instantiate() => new AccesAgence();
public override IHumbabaAuthorize Instantiate(string? v) => new AccesAgence { ResourceValue = v };
}
Definition Right.cs:4
Definition IHumbabaAuthorize.cs:4
Definition AuthorizationService.cs:6

Deux droits se correspondent si IdentityName, ResourceTypeIdentity et ResourceValueIdentity sont égaux (comparaison exacte). DisplayName (nom court de la classe) sert à l'affichage ; IdentityName, DisplayName, ResourceTypeIdentity, ResourceValueIdentity et Authorize sont virtual.

Rôles

Un rôle regroupe des droits dans Rights ; Authorize(exigence) réussit si l'un de ses droits l'accorde. On pose les droits dans le constructeur, ou on les reçoit par UpdateRights.

public class GestionnaireAgence : Role
{
public GestionnaireAgence(string agence)
{
Rights = [new AccesAgence { ResourceValue = agence }];
}
public override IHumbabaAuthorize Instantiate() => new GestionnaireAgence("");
public override IHumbabaAuthorize Instantiate(string? v) => new GestionnaireAgence(v ?? "");
}
Definition Role.cs:4

RoleOn<T> mémorise une ressource (ResourceValueIdentity, posée par UpdateRights), mais elle n'est pas utilisée dans la vérification : ce sont les droits du rôle qui doivent porter la ressource.

RoleFactory et IRightsFactory

RoleFactory.MakeRole<TRole>(ressource) crée TRole (constructeur sans paramètre), résout un IRightsFactory<TRole> dans un scope DI et appelle UpdateRights(await GetRights(ressource), ressource). Sans fabrique enregistrée, le rôle garde les droits de son constructeur. MakeRole(Type, string?) fait la même chose à partir d'un type (par réflexion).

public class GestionnaireRights : IRightsFactory<Gestionnaire> // Gestionnaire : RoleOn<Agence>
{
public Task<Right[]> GetRights(string? agence = null) =>
Task.FromResult<Right[]>([new AccesAgence { ResourceValue = agence }]);
}
services.AddTransient<IRightsFactory<Gestionnaire>, GestionnaireRights>();
Gestionnaire role = await roleFactory.MakeRole<Gestionnaire>("lille");

RoleFactory et IRightsFactory<T> sont marqués [HumbabaService(ServiceLifetime.Transient)] : ils sont pris en compte par la découverte Anum.Ioc via DiscoverHumbabaServices(). RoleFactory peut aussi être enregistré à la main (services.AddTransient<RoleFactory>()).