.NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记
目录
- 开发任务
- 代码实现
开发任务
- DotNetNB.Security.Core:定义 core,models,Istore;实现 default memory store
- DotNetNB.WebApplication:创建 ResourceController 和 PermissionController 进行验证
代码实现
- ResourceController
- PermissionController
ResourceController
创建 ResourceController,通过 ResourceManager 获取所有 Resource
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 进行注释
builder.Services.AddSecurity(options =>
{
options.AddActionAccessControl();
//.AddEntityAccessControl();
});
在 ServiceCollectionExtensions 的扩展方法 AddSecurity 中创建 option,并调用,同时注入 Store 和 Manager
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 注入进来
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
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
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 的接口
[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 模块上,相当于一个桥接
builder.Services.AddIdentity<IdentityUser<string>, IdentityRole<string>>()
.WithPermissions<IdentityUser<string>, IdentityRole<string>>();
GitHub源码链接:
https://github.com/MingsonZheng/dotnetnb.security
课程链接
https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
.NET 云原生架构师训练营(权限系统 代码实现 WebApplication)--学习笔记的更多相关文章
- .NET 云原生架构师训练营(建立系统观)--学习笔记
目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...
- .NET 云原生架构师训练营(对象过程建模)--学习笔记
目录 UML OPM OPM优化 UML 1997年发布UML标准 主要域 视图 图 主要概念 结构 静态视图 类图 类.关联.泛化.依赖关系.实现.接口 用例视图 用例图 用例.参与者.关联.扩展. ...
- .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记
目录 设计原则 设计模式 设计原则 DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You ...
- .NET 云原生架构师训练营(责任链模式)--学习笔记
目录 责任链模式 源码 责任链模式 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无需关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了 何时使用:在处理 ...
- .NET 云原生架构师训练营(系统架构)--学习笔记
目录 对外展现的功能 内部功能 功能交互与价值通路 系统架构 目标 认识系统的价值通路 认识功能架构,通过把功能结构与形式结构结合来描述系统架构 受益原则 好的架构必须使人受益,要想把架构做好,就要专 ...
- .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...
- .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记
目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...
- .NET 云原生架构师训练营(权限系统 RGCA 开发任务)--学习笔记
目录 目标 模块拆分 OPM 开发任务 目标 基于上一讲的模块划分做一个任务拆解,根据任务拆解实现功能 模块拆分 模块划分已经完成了边界的划分,边界内外职责清晰 OPM 根据模块拆分画出 OPM(Ob ...
- .NET 云原生架构师训练营(权限系统 代码实现 ActionAccess)--学习笔记
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...
- .NET 云原生架构师训练营(权限系统 代码实现 Identity)--学习笔记
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...
随机推荐
- Guava Cache源码浅析
1. 简介 Guava Cache是指在JVM的内存中缓存数据,相比较于传统的数据库或redis存储,访问内存中的数据会更加高效,无网络开销. 根据Guava官网介绍,下面的这几种情况可以考虑使用Gu ...
- 【PTA】6-1 **删除C程序中的注释 (31 分)
请你编写一个函数,将C语言源程序中的注释全部删去. 函数原型 // 删除注释 void Pack(FILE *src, FILE *dst); 说明:参数 src 和 dst 均为文件指针,其中:sr ...
- leetcode 33. 搜索旋转排序数组 及 81. 搜索旋转排序数组 II
33. 搜索旋转排序数组 问题描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定 ...
- 【VictoriaMetrics】vm-select源码阅读
调用层次表格 源文件 行号 函数 说明 app/vmselect/main.go 63 main 入口 92行调用 requestHandler app/vmselect/main.go 132 -r ...
- 【解决了一个小问题】golang的go.mod中出现版本错误
代码中的这一句使用prometheus2.28.0版本的代码: import "github.com/prometheus/prometheus/prompb" 我把require ...
- 从数组中找出第K大的数
利用改进的快排方法 public class QuickFindMaxKValue { public static void main(String[] args) { int[] a = {8, 3 ...
- 不难懂————Promise对象 + 详解
1.Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了P ...
- 使用Termux并与ubuntu建立ssh连接
什么是Termux? Termux是一个Android终端仿真器和Linux环境应用程序,直接工作,无需根目录或设置.一个最小的基本系统被自动安装-额外的软件包可以使用APT软件包管理器来使用.不需要 ...
- 泛型编程与 OI——modint
博客链接. 在 OI 中,有大量的题目要求对一些数字取模,这便是本文写作的背景. 背景介绍 这些题目要么是因为答案太大,不方便输出结果,例如许多计数 dp:要么是因为答案是浮点数,出题人不愿意写一个确 ...
- Datawhale 人工智能培养方案
版本号:V0.9 阅读须知 每个专业方向对应一个课程表格 课程表格里的课程排列顺序即为本培养方案推荐的学习顺序 诚挚欢迎为本培养方案贡献课程,有意向的同学请联系Datawhale开源项目管理委员会 本 ...