Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/BootstrapBlazor/Components/Layout/Layout.razor
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
@if (_init)
{
<CascadingValue Value="this" IsFixed="true">
@if (IsAuthenticated)
@if (_authenticated)
{
<section @attributes="AdditionalAttributes" id="@Id" class="@ClassString" style="@StyleString">
@if (Side == null)
Expand Down Expand Up @@ -126,16 +126,16 @@
}
else
{
<ErrorLogger EnableErrorLogger="@_enableErrorLogger" ShowToast="@_showToast" ToastTitle="@ErrorLoggerToastTitle"
EnableILogger="@_enableILogger" OnErrorHandleAsync="OnErrorHandleAsync" OnInitializedCallback="OnErrorLoggerInitialized">
<ErrorLogger EnableErrorLogger="@EnableLogger" ShowToast="@ShowToast" ToastTitle="@ErrorLoggerToastTitle"
EnableILogger="@EnableILogger" OnErrorHandleAsync="OnErrorHandleAsync" OnInitializedCallback="OnErrorLoggerInitialized">
@HandlerMain()
</ErrorLogger>
}
</main>;

RenderFragment RenderTab =>
@<Tab ClickTabToNavigation="ClickTabToNavigation" AdditionalAssemblies="@AdditionalAssemblies"
ShowExtendButtons="ShowTabExtendButtons" ShowClose="ShowTabItemClose" AllowDrag="AllowDragTab"
ShowExtendButtons="ShowTabExtendButtons" ShowClose="ShowTabItemClose" AllowDrag="AllowDragTab"
DefaultUrl="@TabDefaultUrl" ExcludeUrls="@ExcludeUrls" IsOnlyRenderActiveTab="IsOnlyRenderActiveTab"
TabStyle="TabStyle" ShowToolbar="@ShowToolbar" ToolbarTemplate="@ToolbarTemplate"
ShowContextMenu="ShowTabContextMenu"
Expand All @@ -148,7 +148,7 @@
RefreshToolbarTooltipText="@RefreshToolbarTooltipText" FullscreenToolbarTooltipText="@FullscreenToolbarTooltipText"
OnToolbarRefreshCallback="OnToolbarRefreshCallback" TabHeader="TabHeader"
Body="@Main" NotAuthorized="NotAuthorized!" NotFound="NotFound!" NotFoundTabText="@NotFoundTabText"
EnableErrorLogger="@_enableErrorLogger" ErrorLoggerToastTitle="@ErrorLoggerToastTitle">
EnableErrorLogger="@EnableLogger" ErrorLoggerToastTitle="@ErrorLoggerToastTitle">
</Tab>;

RenderFragment RenderFooter =>
Expand Down
52 changes: 28 additions & 24 deletions src/BootstrapBlazor/Components/Layout/Layout.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,12 @@ public partial class Layout : IHandlerException, ITabHeader
[Parameter]
public bool ShowTabInHeader { get; set; }

/// <summary>
/// 获得/设置 是否跳过认证逻辑 默认 false
/// </summary>
[Parameter]
public bool SkipAuthenticate { get; set; }

[Inject]
[NotNull]
private NavigationManager? Navigation { get; set; }
Expand All @@ -374,7 +380,7 @@ public partial class Layout : IHandlerException, ITabHeader
/// <summary>
/// 获得/设置 是否已授权
/// </summary>
private bool IsAuthenticated { get; set; }
private bool _authenticated;

/// <summary>
/// 获得 组件样式
Expand Down Expand Up @@ -501,15 +507,15 @@ public partial class Layout : IHandlerException, ITabHeader
private IOptionsMonitor<BootstrapBlazorOptions>? Options { get; set; }

private bool _init;
private LayoutHeader? _layoutHeader = null;
private LayoutHeader? _layoutHeader;

private ITabHeader? TabHeader => ShowTabInHeader ? this : null;

private bool _enableErrorLogger => EnableErrorLogger ?? Options.CurrentValue.EnableErrorLogger;
private bool EnableLogger => EnableErrorLogger ?? Options.CurrentValue.EnableErrorLogger;

private bool _showToast => ShowErrorLoggerToast ?? Options.CurrentValue.ShowErrorLoggerToast;
private bool ShowToast => ShowErrorLoggerToast ?? Options.CurrentValue.ShowErrorLoggerToast;

private bool _enableILogger => EnableErrorLoggerILogger ?? Options.CurrentValue.EnableErrorLoggerILogger;
private bool EnableILogger => EnableErrorLoggerILogger ?? Options.CurrentValue.EnableErrorLoggerILogger;

/// <summary>
/// <inheritdoc/>
Expand All @@ -535,30 +541,28 @@ protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();

// 需要认证并且未认证
if (AuthenticationStateTask != null)
if (SkipAuthenticate || AuthenticationStateTask == null)
{
// wasm 模式下 开启权限必须提供 AdditionalAssemblies 参数
AdditionalAssemblies ??= [Assembly.GetEntryAssembly()!];
_authenticated = true;
_init = true;
return;
}

var url = Navigation.ToBaseRelativePathWithoutQueryAndFragment();
var context = RouteTableFactory.Create(AdditionalAssemblies, url);
if (context.Handler != null)
{
IsAuthenticated = await context.Handler.IsAuthorizedAsync(ServiceProvider, AuthenticationStateTask, Resource);
// wasm 模式下 开启权限必须提供 AdditionalAssemblies 参数
AdditionalAssemblies ??= [Assembly.GetEntryAssembly()!];

// 检查当前 Url
if (OnAuthorizing != null)
{
IsAuthenticated = IsAuthenticated && await OnAuthorizing(Navigation.Uri);
}
}
}
else
var url = Navigation.ToBaseRelativePathWithoutQueryAndFragment();
var context = RouteTableFactory.Create(AdditionalAssemblies, url);
if (context.Handler != null)
{
IsAuthenticated = true;
}
_authenticated = await context.Handler.IsAuthorizedAsync(ServiceProvider, AuthenticationStateTask, Resource);

// 检查当前 Url
if (OnAuthorizing != null)
{
_authenticated = _authenticated && await OnAuthorizing(Navigation.Uri);
}
}
_init = true;
}

Expand Down
17 changes: 17 additions & 0 deletions test/UnitTest/Components/LayoutTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,23 @@ public void CollapseBarTemplate_Ok()
Assert.Contains("CollapseBarTemplate-Content", cut.Markup);
}


[Fact]
public void SkipAuthenticate_Ok()
{
// 未授权,通过控制 SkipAuthenticate 属性跳过授权
var cut = Context.RenderComponent<CascadingValue<Task<AuthenticationState>>>(pb =>
{
pb.Add(a => a.Value, Task.FromResult(new AuthenticationState(new ClaimsPrincipal())));
pb.AddChildContent<Layout>(pb =>
{
pb.Add(a => a.SkipAuthenticate, true);
pb.Add(a => a.Main, builder => builder.AddContent(0, "Main"));
});
});
cut.MarkupMatches("<section id:ignore class=\"layout\" style=\"--bb-layout-header-height: 0px; --bb-layout-footer-height: 0px;\"><main class=\"layout-main\">Main</main></section>");
}

private static RenderFragment CreateHeader(string? content = "Header") => builder => builder.AddContent(0, content);

private static RenderFragment CreateFooter(string? content = "Footer") => builder => builder.AddContent(0, content);
Expand Down
Loading