Protect finance cockpit with login
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
@using TrafagSalesExporter.Services
|
||||
@inject IFinanceCockpitAccessService FinanceAccess
|
||||
@inject ISnackbar Snackbar
|
||||
@inject NavigationManager Navigation
|
||||
@inject IUiTextService UiText
|
||||
|
||||
<MudText Typo="Typo.h4" Class="mb-4">@T("Finance Cockpit", "Finance Cockpit")</MudText>
|
||||
|
||||
<MudPaper Class="pa-4 mb-4" Elevation="1" Style="max-width:520px;">
|
||||
<MudStack Spacing="3">
|
||||
<MudAlert Severity="Severity.Warning" Variant="Variant.Outlined">
|
||||
@T("Finance Cockpit ist geschuetzt. Bitte separat anmelden.", "Finance Cockpit is protected. Please sign in separately.")
|
||||
</MudAlert>
|
||||
@if (!FinanceAccess.IsConfigured)
|
||||
{
|
||||
<MudAlert Severity="Severity.Error" Variant="Variant.Filled">
|
||||
@T("Finance-Cockpit-Zugang ist noch nicht konfiguriert. Bitte Username und PasswordHash in FinanceCockpitAccess konfigurieren.", "Finance Cockpit access is not configured yet. Please configure Username and PasswordHash in FinanceCockpitAccess.")
|
||||
</MudAlert>
|
||||
}
|
||||
<MudTextField @bind-Value="_username" Label="@T("Name", "Name")" Disabled="@(!FinanceAccess.IsConfigured)" />
|
||||
<MudTextField @bind-Value="_password" Label="@T("Passwort", "Password")" InputType="InputType.Password" Disabled="@(!FinanceAccess.IsConfigured)" />
|
||||
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="UnlockAsync"
|
||||
StartIcon="@Icons.Material.Filled.LockOpen" Disabled="@(!FinanceAccess.IsConfigured)">
|
||||
@T("Finance Cockpit entsperren", "Unlock Finance Cockpit")
|
||||
</MudButton>
|
||||
</MudStack>
|
||||
</MudPaper>
|
||||
|
||||
@code {
|
||||
private string? _username;
|
||||
private string? _password;
|
||||
|
||||
private Task UnlockAsync()
|
||||
{
|
||||
if (!FinanceAccess.TryUnlock(_username ?? string.Empty, _password ?? string.Empty))
|
||||
{
|
||||
Snackbar.Add(T("Finance-Cockpit-Anmeldung fehlgeschlagen.", "Finance Cockpit sign-in failed."), Severity.Error);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
_password = string.Empty;
|
||||
Navigation.Refresh(forceReload: false);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private string T(string german, string english) => UiText.Text(german, english);
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
@using TrafagSalesExporter.Security
|
||||
@inject TrafagSalesExporter.Services.IUiTextService UiText
|
||||
@inject TrafagSalesExporter.Services.IFinanceCockpitAccessService FinanceAccess
|
||||
@inject NavigationManager Navigation
|
||||
|
||||
<MudNavMenu>
|
||||
<MudNavGroup Title="@T("Finance Cockpit", "Finance Cockpit")" Icon="@Icons.Material.Filled.Analytics" Expanded="true">
|
||||
@@ -12,30 +14,43 @@
|
||||
<MudNavLink Href="/finance-cockpit/vergleich" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.CompareArrows">
|
||||
@T("Soll/Ist Vergleich", "Actual/reference comparison")
|
||||
</MudNavLink>
|
||||
<MudNavGroup Title="@T("Admin", "Admin")" Icon="@Icons.Material.Filled.AdminPanelSettings">
|
||||
<AuthorizeView Policy="@SecurityPolicies.AdminOnly">
|
||||
<Authorized>
|
||||
<MudNavLink Href="/standorte" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.LocationOn">
|
||||
@T("Standorte", "Sites")
|
||||
</MudNavLink>
|
||||
<MudNavLink Href="/transformations" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.Transform">
|
||||
@T("Transformationen", "Transformations")
|
||||
</MudNavLink>
|
||||
<MudNavLink Href="/settings" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.Settings">
|
||||
@T("Settings", "Settings")
|
||||
</MudNavLink>
|
||||
</Authorized>
|
||||
</AuthorizeView>
|
||||
<MudNavLink Href="/logs" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.List">
|
||||
@T("Logs", "Logs")
|
||||
</MudNavLink>
|
||||
</MudNavGroup>
|
||||
@if (FinanceAccess.IsEnabled && FinanceAccess.IsUnlocked)
|
||||
{
|
||||
<MudButton Variant="Variant.Text" Color="Color.Secondary" Size="Size.Small"
|
||||
StartIcon="@Icons.Material.Filled.Lock" OnClick="LockFinanceCockpit" Class="ml-3">
|
||||
@T("Finance sperren", "Lock finance")
|
||||
</MudButton>
|
||||
}
|
||||
</MudNavGroup>
|
||||
<MudNavLink Href="/hr-kpi" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.Groups">
|
||||
@T("HR KPI (Login)", "HR KPI (login)")
|
||||
</MudNavLink>
|
||||
<MudNavGroup Title="@T("Admin", "Admin")" Icon="@Icons.Material.Filled.AdminPanelSettings">
|
||||
<AuthorizeView Policy="@SecurityPolicies.AdminOnly">
|
||||
<Authorized>
|
||||
<MudNavLink Href="/standorte" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.LocationOn">
|
||||
@T("Standorte", "Sites")
|
||||
</MudNavLink>
|
||||
<MudNavLink Href="/transformations" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.Transform">
|
||||
@T("Transformationen", "Transformations")
|
||||
</MudNavLink>
|
||||
<MudNavLink Href="/settings" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.Settings">
|
||||
@T("Settings", "Settings")
|
||||
</MudNavLink>
|
||||
</Authorized>
|
||||
</AuthorizeView>
|
||||
<MudNavLink Href="/logs" Match="NavLinkMatch.Prefix" Icon="@Icons.Material.Filled.List">
|
||||
@T("Logs", "Logs")
|
||||
</MudNavLink>
|
||||
</MudNavGroup>
|
||||
</MudNavMenu>
|
||||
|
||||
@code {
|
||||
private void LockFinanceCockpit()
|
||||
{
|
||||
FinanceAccess.Lock();
|
||||
Navigation.NavigateTo("/");
|
||||
}
|
||||
|
||||
private string T(string german, string english) => UiText.Text(german, english);
|
||||
}
|
||||
|
||||
@@ -1,23 +1,53 @@
|
||||
@using Microsoft.AspNetCore.Components.Authorization
|
||||
@inject NavigationManager Navigation
|
||||
@inject TrafagSalesExporter.Services.IFinanceCockpitAccessService FinanceAccess
|
||||
|
||||
<CascadingAuthenticationState>
|
||||
<Router AppAssembly="typeof(Program).Assembly">
|
||||
<Found Context="routeData">
|
||||
<AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)">
|
||||
<NotAuthorized>
|
||||
<LayoutView Layout="typeof(Layout.MainLayout)">
|
||||
<MudAlert Severity="Severity.Error" Variant="Variant.Outlined">
|
||||
Zugriff verweigert. Bitte mit einem berechtigten Windows-/Domain-Benutzer anmelden.
|
||||
</MudAlert>
|
||||
</LayoutView>
|
||||
</NotAuthorized>
|
||||
<Authorizing>
|
||||
<LayoutView Layout="typeof(Layout.MainLayout)">
|
||||
<MudProgressCircular Indeterminate="true" />
|
||||
</LayoutView>
|
||||
</Authorizing>
|
||||
</AuthorizeRouteView>
|
||||
@if (RequiresFinanceUnlock() && FinanceAccess.IsEnabled && !FinanceAccess.IsUnlocked)
|
||||
{
|
||||
<LayoutView Layout="typeof(Layout.MainLayout)">
|
||||
<FinanceCockpitUnlockPanel />
|
||||
</LayoutView>
|
||||
}
|
||||
else
|
||||
{
|
||||
<AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)">
|
||||
<NotAuthorized>
|
||||
<LayoutView Layout="typeof(Layout.MainLayout)">
|
||||
<MudAlert Severity="Severity.Error" Variant="Variant.Outlined">
|
||||
Zugriff verweigert. Bitte mit einem berechtigten Windows-/Domain-Benutzer anmelden.
|
||||
</MudAlert>
|
||||
</LayoutView>
|
||||
</NotAuthorized>
|
||||
<Authorizing>
|
||||
<LayoutView Layout="typeof(Layout.MainLayout)">
|
||||
<MudProgressCircular Indeterminate="true" />
|
||||
</LayoutView>
|
||||
</Authorizing>
|
||||
</AuthorizeRouteView>
|
||||
}
|
||||
<FocusOnNavigate RouteData="routeData" Selector="h1" />
|
||||
</Found>
|
||||
</Router>
|
||||
</CascadingAuthenticationState>
|
||||
|
||||
@code {
|
||||
private bool RequiresFinanceUnlock()
|
||||
{
|
||||
var path = Navigation.ToBaseRelativePath(Navigation.Uri)
|
||||
.Split('?', '#')[0]
|
||||
.Trim('/')
|
||||
.ToLowerInvariant();
|
||||
|
||||
return path is "" or
|
||||
"management-cockpit" or
|
||||
"finance-cockpit/vergleich" or
|
||||
"standorte" or
|
||||
"transformations" or
|
||||
"settings" or
|
||||
"logs" or
|
||||
"source-viewer";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,5 +7,6 @@
|
||||
@using Microsoft.JSInterop
|
||||
@using MudBlazor
|
||||
@using TrafagSalesExporter.Components
|
||||
@using TrafagSalesExporter.Components.FinanceCockpit
|
||||
@using TrafagSalesExporter.Components.Layout
|
||||
@using TrafagSalesExporter.Models
|
||||
|
||||
Reference in New Issue
Block a user