从零开始Blazor Server(7)–使用Furion权限验证

上面两篇我们讲了怎么用OnNavigateAsync来验证权限,又写了怎么用策略来验证权限。

其实我们既然集成了Fution,就可以用Furion带的方式来验证。

创建AdminHandler

我们还是去创建AdminHandler,但是跟策略不一样的是我们的Handler不继承于AuthorizationHandler,而是继承Furion的AppAuthorizeHandler

public class AdminHandler : AppAuthorizeHandler

AppAuthorizeHandler有两个比较重要的方法。

public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)

public override async Task HandleAsync(AuthorizationHandlerContext context)

PipelineAsync进入的时候已经完成了基本的验证,能确定该用户已经登录了,返回值是一个bool

HandleAsync就是我们使用策略时的HandleRequirementAsync,也需要用context.Succeed来做处理。

这里我们就直接使用PipelineAsync就行了,比较省心。所以我们的代码如下:

public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)     {         if (!int.TryParse(context.User.FindFirst(ClaimTypes.Role)?.Value, out var roleId))         {             return Task.FromResult(false);         }         if (context.Resource is RouteData routeData)         {             var routeAttr = routeData.PageType.CustomAttributes.FirstOrDefault(x =>                 x.AttributeType == typeof(RouteAttribute));             if (routeAttr == null)             {                 return Task.FromResult(true);             }             else             {                 var url = routeAttr.ConstructorArguments[0].Value as string;                 var permission = PermissionEntity                     .Where(x => x.Roles!.Any(y => y.Id == roleId) && x.Url == url).First();                 if (permission != null)                 {                     return Task.FromResult(true);                 }             }         }                  return Task.FromResult(false);     }

整体的逻辑与使用策略时相同。这里不再多说了。

App.razor

App里一样要加上Resource="@routeData" ,不然我们无法获取到路由信息。

Pragram.cs

我们同样需要在Proagram.cs里注册我们的Handler,但是比使用策略注册要简单的多,只需要一句话。

builder.Services.AddAppAuthorization<AdminHandler>();

使用

我们的Handler默认是默认策略,所以我们不需要在加策略名称,只需要在需要使用的地方,比如index.razor中增加

@attribute [Authorize]

即可。

源码在github:https://github.com/j4587698/BlazorLearn,分支lesson7.

发表评论

相关文章