目录

  • 模块拆分
  • EntityAccess

模块拆分

EntityAccess

  • 实体权限
  • 属性权限

实体权限

创建 student

https://localhost:7018/Student/dotnetnb2

获取 student

https://localhost:7018/Student

对 student 的 permission 做一个保护,创建一个 entitiy 的 permission,create 为 true,delete 和 update 为 false

https://localhost:7018/Permission/entity

参数

{
"key": "student-entity-create",
"group": "ApplicationDbContext",
"displayName": "student-entity-create",
"description": "新增权限",
"resources": [
"DotNetNB.WebApplication.Models.Student"
],
"data": {
"entityName": "DotNetNB.WebApplication.Models.Student",
"create": true,
"delete": false,
"members": [
{
"memberName": "Age",
"update": false
}
]
}
}

创建之后获取一下 permission,可以看到创建的对于 student-entity-create 的一个 action 的 permission

https://localhost:7018/Permission

创建完 permission 之后再创建 student 就会抛出 AuthenticationException 异常,未认证

https://localhost:7018/Student/dotnetnb2

这是通过 dbcontext 在 SavingChangesAsync 的时候由 Intersect 实现的,因为访问接口的时候没有带上 token

if (!createPermission.Intersect(claimValues).Any())
throw new AuthorizationException();

获取 token

https://localhost:7018/Authentication/login

接着把 token 放到创建 student 请求的 headers 之后,会抛出 AuthorizationException 异常,未授权

https://localhost:7018/Student/dotnetnb2

说明已经登录成功,完成认证,但是没有相关权限,因为 token 中没有包含 student-entity-create 的 permission

为用户添加 permission,因为 admin 用户拥有一个 admin 的 role,所以只需要将 permission 添加给 admin 的 role 即可

https://localhost:7018/Permission/addtorole?role=admin&permission=student-entity-create

permission 添加之后需要重新获取 token

https://localhost:7018/Authentication/login

解析 token 可以看到包含 student-entity-create 的 permission

使用这个 token 创建 student 就可以创建成功

https://localhost:7018/Student/dotnetnb2

获取所有 student,可以看到多了一个 dotnetnb2

https://localhost:7018/Student

但是这个 token 没有给 delete 的权限,所以 delete 会抛出 AuthorizationException 异常,未授权

https://localhost:7018/Student/dotnetnb2

因为之前的 permission 中 delete 为 false

"delete": false,

需要再添加一个包含 delete 权限的 permission:student-entity-create-and-delete

https://localhost:7018/Permission/entity

参数

{
"key": "student-entity-create-and-delete",
"group": "ApplicationDbContext",
"displayName": "student-entity-create-and-delete",
"description": "新增删除权限",
"resources": [
"DotNetNB.WebApplication.Models.Student"
],
"data": {
"entityName": "DotNetNB.WebApplication.Models.Student",
"create": true,
"delete": true,
"members": [
{
"memberName": "Age",
"update": false
}
]
}
}

创建之后获取一下 permission,可以看到 student-entity-create-and-delete 的 permission

https://localhost:7018/Permission

直接授权这个 permission 给用户 admin

https://localhost:7018/Permission/addtouser?username=admin&permission=student-entity-create-and-delete

重新获取 token

https://localhost:7018/Authentication/login

解析 token 看到包含 student-entity-create-and-delete

使用这个 token 删除 student 就可以成功

https://localhost:7018/Student/dotnetnb2

获取 student,可以发现 dotnetnb2 已经删除成功了

https://localhost:7018/Student

属性权限

调用接口修改 student 的 age 属性,会抛出 AuthenticationException 异常,未认证

https://localhost:7018/Student/addAge/dotnetnb

登录之后使用 token 请求,会抛出 AuthorizationException 异常,未授权

https://localhost:7018/Student/addAge/dotnetnb

因为之前添加的 permission 对 age 属性不可修改

"members": [
{
"memberName": "Age",
"update": false
}

需要新增一个可以修改 age 属性的 permission

https://localhost:7018/Permission/entity

参数

{
"key": "student-entity-all",
"group": "ApplicationDbContext",
"displayName": "student-entity-all",
"description": "全部权限",
"resources": [
"DotNetNB.WebApplication.Models.Student"
],
"data": {
"entityName": "DotNetNB.WebApplication.Models.Student",
"create": true,
"delete": true,
"members": [
{
"memberName": "Age",
"update": true
}
]
}
}

将该 permission 赋值给 admin,重新获取 token,再调用接口修改 student 的 age 属性

https://localhost:7018/Student/addAge/dotnetnb

修改成功后再获取 student,可以看到 dotnetnb 的 age 从 0 变为 1,修改成功

https://localhost:7018/Student

GitHub源码链接:

https://github.com/MingsonZheng/dotnetnb.security refactor 分支

课程链接

https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

.NET 云原生架构师训练营(权限系统 系统演示 EntityAccess)--学习笔记的更多相关文章

  1. .NET 云原生架构师训练营(建立系统观)--学习笔记

    目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...

  2. .NET 云原生架构师训练营(对象过程建模)--学习笔记

    目录 UML OPM OPM优化 UML 1997年发布UML标准 主要域 视图 图 主要概念 结构 静态视图 类图 类.关联.泛化.依赖关系.实现.接口 用例视图 用例图 用例.参与者.关联.扩展. ...

  3. .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记

    目录 设计原则 设计模式 设计原则 DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You ...

  4. .NET 云原生架构师训练营(责任链模式)--学习笔记

    目录 责任链模式 源码 责任链模式 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无需关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了 何时使用:在处理 ...

  5. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  6. .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记

    目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...

  7. .NET 云原生架构师训练营(设计原则与模式)--学习笔记

    在复杂系统的架构设计中引入设计原则与模式,能够极大降低复杂系统开发.和维护的成本 目录 几个问题 为什么要学习设计模式 优良架构设计的具体指标 理解复杂系统 面向对象思想(指导复杂系统的分析.设计.实 ...

  8. .NET 云原生架构师训练营(权限系统 RGCA 开发任务)--学习笔记

    目录 目标 模块拆分 OPM 开发任务 目标 基于上一讲的模块划分做一个任务拆解,根据任务拆解实现功能 模块拆分 模块划分已经完成了边界的划分,边界内外职责清晰 OPM 根据模块拆分画出 OPM(Ob ...

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

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...

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

    目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Secu ...

随机推荐

  1. 面试官问,Redis 是单线程还是多线程?我懵了

    我们平时看到介绍 Redis 的文章,都会说 Redis 是单线程的.但是我们学习的时候,比如 Redis 的 bgsave 命令,它的作用是在后台异步保存当前数据库的数据到磁盘,那既然是异步了,肯定 ...

  2. MRCTF2020 套娃

    MRCTF2020套娃 打开网页查看源代码 关于$_SERVER['QUERY_STRING']取值,例如: http://localhost/aaa/?p=222 $_SERVER['QUERY_S ...

  3. C++11之future(二)

    如果有两个线程,其中一个线程想要获取另一个线程的返回值,该怎么办? 于是接下来要谈的package_task就是为了解决这个问题而诞生的. // ConsoleApplication5.cpp : 定 ...

  4. 机器学习-softmax回归 python实现

    ---恢复内容开始--- Softmax Regression 可以看做是 LR 算法在多分类上的推广,即类标签 y 的取值大于或者等于 2. 假设数据样本集为:$\left \{ \left ( X ...

  5. Edge 91以上554、10080出现ERR_UNSAFE_PORT解决办法

    解决办法 在注册表下面这个路径新建一个键值名为1的,输入10080(或554),重启浏览器,即可解决问题. 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Micro ...

  6. alpakka-kafka(9)-kafka在分布式运算中的应用

    kafka具备的分布式.高吞吐.高可用特性,以及所提供的各种消息消费模式可以保证在一个多节点集群环境里消息被消费的安全性:即防止每条消息遗漏处理或重复消费.特别是exactly-once消费策略:可以 ...

  7. 码风QwQ

    注:卡常.压行时怎么有效怎么来QwQ 快读真香.( 不喜欢用字符数组,使用string. 此时cin cout输入前会加这样三句以优化: ios::sync_with_stdio(0); cin.ti ...

  8. 如何使用 numpy 和 pytorch 快速计算 IOU

    前言 在目标检测中用交并比(Interection-over-unio,简称 IOU)来衡量两个边界框之间的重叠程度,下面就使用 numpy 和 pytorch 两种框架的矢量计算方式来快速计算各种情 ...

  9. file类和fileinfo类的简单对比

    File类:提供用于操作文件的静态方法. FileInfo类:提供操作文件的属性和实例方法. Directory类:提供用于操作目录的静态方法. DirectoryInfo类:提供用于操作目录的实例方 ...

  10. Atcoder ARC-062

    ARC062(2020.7.13) A 可以考虑直接同时扩大这次的两个票数,那么使得两数均大于之前位置的票数就是最优的,扩大的话直接除一下上取整即可. B 贪心即可. C 可以发现这个东西如果直接计数 ...