Aller au contenu principal

LgAuthorizeView & LgCascadingPolicies

Deux composants pilotent les autorisations dans l'interface :

  • LgAuthorizeView conditionne l'affichage (PolicyVisible) et l'édition (PolicyEdit) de son contenu à des policies, et propage ces policies en cascade aux composants Lagoon enfants ;
  • LgCascadingPolicies déclare des policies toujours validées dans son sous-arbre, ce qui évite de réévaluer les droits composant par composant.

Les policies elles-mêmes sont déclarées côté serveur — voir Rôles et policies.

<LgAuthorizeView PolicyVisible="@Policies.IsAdmin">
...
</LgAuthorizeView>
  • Espace de noms : Lagoon.UI.Components
  • Hérite de : ComponentBase (tous les deux)
  • Interfaces : ILgComponentPolicies (LgAuthorizeView) ; IComponentContextProvider (LgCascadingPolicies)
  • Package NuGet : Lagoon.UI

Utilisation​

Masquer une zone selon une policy​

Le contenu de LgAuthorizeView n'est rendu que si l'utilisateur satisfait PolicyVisible. NotAuthorized fournit un contenu de remplacement et Authorizing un contenu d'attente pendant l'évaluation asynchrone des droits.

AdminSectionPage.razor
<LgAuthorizeView PolicyVisible="@Policies.IsAdmin">
<ChildContent>
<LgTitle Text="#Administration" TitleLevel="TitleLevel.Level2" />
<LgButton Text="#PurgeData" OnClick="PurgeAsync" />
</ChildContent>
<NotAuthorized>
<LgBigMessage Title="#AccessDenied" />
</NotAuthorized>
</LgAuthorizeView>
AdminSectionPage.razor.cs
public partial class AdminSectionPage : LgPage
{
// Action réservée aux administrateurs : la zone entière est masquée sans la policy.
private async Task PurgeAsync(ActionEventArgs args)
{
await Task.Delay(100, args.CancellationToken);
ShowSuccess("#DataPurged");
}
}

Authorized est équivalent à ChildContent (avec l'état d'authentification en contexte) — ne définissez pas les deux, une exception serait levée.

Rendre une zone non éditable​

PolicyEdit laisse le contenu visible mais le rend non éditable si la policy n'est pas satisfaite : les champs Lagoon enfants (qui consomment le paramètre en cascade ParentAuthorizeView) passent en lecture seule.

OrderFormPage.razor
<LgAuthorizeView PolicyEdit="@Policies.CanEditOrders">
<LgTextBox Label="#Reference" @bind-Value="_model.Reference" />
<LgDateBox Label="#OrderDate" @bind-Value="_model.OrderDate" />
</LgAuthorizeView>
OrderFormPage.razor.cs
public partial class OrderFormPage : LgPage
{
private readonly OrderVm _model = new();

private sealed class OrderVm
{
public string Reference { get; set; }
public DateTime? OrderDate { get; set; }
}
}

Les composants Lagoon exposent aussi PolicyVisible / PolicyEdit individuellement (ex. LgButton) : LgAuthorizeView sert à factoriser la règle sur une zone entière.

Conteneur de rendu​

Par défaut, le contenu autorisé est rendu sans élément englobant, sauf si CssClass est défini. ShowDiv force (ou interdit) l'encapsulation dans un <div>.

DashboardPage.razor
<LgAuthorizeView PolicyVisible="@Policies.SeeStatistics" CssClass="dashboard-stats">
...
</LgAuthorizeView>

Propager des policies validées avec LgCascadingPolicies​

LgCascadingPolicies marque des policies comme déjà validées pour tout son sous-arbre : les composants enfants qui exigent l'une de ces policies (via PolicyVisible / PolicyEdit) les considèrent satisfaites sans réévaluation. C'est utile quand un écran a déjà vérifié le droit en amont, ou pour des rendus répétés (lignes de grille, listes).

ProjectPage.razor
<LgCascadingPolicies ValidatedPolicies="@_validatedPolicies">
@foreach (TaskVm task in _tasks)
{
<LgButton Text="@task.Name" PolicyEdit="@Policies.CanEditTasks" />
}
</LgCascadingPolicies>
ProjectPage.razor.cs
public partial class ProjectPage : LgPage
{
// Policies déjà vérifiées à l'entrée de l'écran : évite une réévaluation par bouton.
private string _validatedPolicies = Policies.CanEditTasks;

private readonly List<TaskVm> _tasks = new();

private sealed class TaskVm
{
public string Name { get; set; }
}
}

La méthode AuthorizeAsync(policyName) (via @ref) vérifie une policy dans le contexte du composant.

Propriétés​

Toutes les propriétés [Parameter] des deux composants.

LgAuthorizeView​

NomTypeDéfautDéclaré dansDescription
AuthorizedRenderFragment<AuthenticationState>nullLgAuthorizeViewContenu affiché si l'utilisateur est autorisé. Incompatible avec ChildContent.
AuthorizingRenderFragmentnullLgAuthorizeViewContenu affiché pendant l'évaluation asynchrone des droits.
ChildContentRenderFragmentnullLgAuthorizeViewContenu affiché si l'utilisateur est autorisé.
CssClassstringnullLgAuthorizeViewClasses CSS du <div> englobant (sa présence active l'encapsulation).
NotAuthorizedRenderFragment<AuthenticationState>nullLgAuthorizeViewContenu affiché si l'utilisateur n'est pas autorisé.
PolicyEditstringnullLgAuthorizeViewPolicy requise pour éditer le contenu ; sinon les composants enfants passent en lecture seule.
PolicyVisiblestringnullLgAuthorizeViewPolicy requise pour afficher le contenu.
ShowDivbool?nullLgAuthorizeViewForce (true) ou interdit (false) l'encapsulation dans un <div>. Si null, un <div> n'est rendu que si CssClass est défini.

LgCascadingPolicies​

NomTypeDéfautDéclaré dansDescription
ChildContentRenderFragmentnullLgCascadingPoliciesContenu du sous-arbre bénéficiant des policies validées.
ValidatedPoliciesstringnullLgCascadingPoliciesPolicies considérées comme toujours validées dans le sous-arbre.

Méthodes & événements​

MembreSignatureDescription
LgCascadingPolicies.AuthorizeAsyncTask<bool> AuthorizeAsync(string policyName)Vérifie si l'utilisateur satisfait la policy dans le contexte du composant.

Bonnes pratiques / accessibilité​

  • Déclarez les noms de policies dans une classe partagée client/serveur (Policies.XXX) plutôt qu'en chaînes littérales.
  • Le masquage côté client est un confort d'interface, pas une protection : les contrôleurs doivent porter leurs propres attributs [Authorize] — voir Rôles et policies.
  • Utilisez LgCascadingPolicies pour les zones à rendu répété : chaque évaluation de policy évitée est un aller-retour de moins vers le contexte d'autorisation.

Composants liés​

  • LgButton — PolicyVisible / PolicyEdit au niveau d'un composant.
  • LgEditForm — formulaire dont les champs héritent des policies en cascade.