前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记

.NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记

原创
作者头像
郑子铭
修改2022-02-24 10:08:54
2850
修改2022-02-24 10:08:54
举报

目录

  • 开发任务
  • 代码实现

开发任务

  • DotNetNB.Security.Core:定义 core,models,Istore;实现 default memory store
  • DotNetNB.WebApplication:创建 ResourceController 和 PermissionController 进行验证
image.png
image.png

代码实现

  • ResourceController
  • PermissionController

ResourceController

创建 ResourceController,通过 ResourceManager 获取所有 Resource

代码语言:txt
复制
using DotNetNB.Security.Core;
using Microsoft.AspNetCore.Mvc;

namespace DotNetNB.WebApplication.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class ResourceController : ControllerBase
    {
        private readonly IResourceManager _resourceManager;

        public ResourceController(IResourceManager resourceManager)
        {
            _resourceManager = resourceManager;
        }


        [HttpGet]
        [Route("")]
        public async Task<IActionResult> GetAll()
        {
            return Ok(await _resourceManager.GetAllAsync());
        }
    }
}

在 Program 中先将 AddEntityAccessControl 进行注释

代码语言:txt
复制
builder.Services.AddSecurity(options =>
{
    options.AddActionAccessControl();
    //.AddEntityAccessControl();
});

在 ServiceCollectionExtensions 的扩展方法 AddSecurity 中创建 option,并调用,同时注入 Store 和 Manager

代码语言:txt
复制
using DotNetNB.Security.Core.Store;
using Microsoft.Extensions.DependencyInjection;

namespace DotNetNB.Security.Core.Extensions
{
    public static class ServiceCollectionExtensions
    {
        public static IServiceCollection AddSecurity(this IServiceCollection services, Action<SecurityOption>? configure)
        {
            var option = new SecurityOption { Services = services };
            configure?.Invoke(option);
        
            services.AddSingleton<IResourceStore, DefaultResourceStore>()
                .AddSingleton<IPermissionStore, DefaultPermissionStore>()
                .AddScoped<IResourceManager, ResourceManager>()
                .AddScoped<IPermissionManager, PermissionManager>()
                .AddHostedService<ResourceProviderHostedService>();
            return services;
        }
    }
}

在 ResourceProviderHostedService 的 StartAsync 方法中将 host 启动时的所有 action 注入进来

代码语言:txt
复制
using DotNetNB.Security.Core.Models;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace DotNetNB.Security.Core
{
    public class ResourceProviderHostedService : IHostedService
    {
        private readonly IServiceProvider _serviceProvider;

        public ResourceProviderHostedService(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public async Task StartAsync(CancellationToken cancellationToken)
        {
            using var scope = _serviceProvider.CreateScope();
            var providers = scope.ServiceProvider.GetServices<IResourceProvider>();
            var resourceManager = scope.ServiceProvider.GetService<IResourceManager>();

            var resources = new List<Resource>();
            foreach (var provider in providers)
            {
                resources.AddRange(await provider.ExecuteAsync());
            }

            await resourceManager.CreateAsync(resources);
        }

        public async Task StopAsync(CancellationToken cancellationToken)
        {
        }
    }
}

设置 DotNetNB.WebApplication 为启动项,启动项目,可以通过接口看到 action 相关信息

图片001

PermissionController

创建 PermissionController,通过 PermissionManager 获取所有 Permission

代码语言:txt
复制
using DotNetNB.Security.Core;
using Microsoft.AspNetCore.Mvc;

namespace DotNetNB.WebApplication.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class PermissionController : ControllerBase
    {
        private readonly IPermissionManager _permissionManager;

        public PermissionController(IPermissionManager permissionManager)
        {
            _permissionManager = permissionManager;
        }

        [HttpGet]
        public async Task<IActionResult> GetAll()
        {
            return Ok(await _permissionManager.GetAllAsync());
        }
    }
}

创建 dto 对象 CreatePermissionRequest

代码语言:txt
复制
namespace DotNetNB.WebApplication.ViewModels
{
    public class CreatePermissionRequest
    {
        public string Key { get; set; }

        public string DisplayName { get; set; }

        public string Description { get; set; }

        public IEnumerable<string> resources { get; set; }
    }
}

在 PermissionController 中添加创建 Permission 的接口

代码语言:txt
复制
[HttpPost]
public async Task<IActionResult> Create([FromBody] CreatePermissionRequest request)
{
    await _permissionManager.CreateAsync(request.Key, request.DisplayName, request.Description, request.resources);
    return Ok();
}

在 Program 中将我们的 Permission 模块添加到 Identity 模块上,相当于一个桥接

代码语言:txt
复制
builder.Services.AddIdentity<IdentityUser<string>, IdentityRole<string>>()
    .WithPermissions<IdentityUser<string>, IdentityRole<string>>();

GitHub源码链接:

https://github.com/MingsonZheng/dotnetnb.security

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
    • 开发任务
      • 代码实现
        • ResourceController
        • PermissionController
      • GitHub源码链接:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com