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

.NET 云原生架构师训练营(权限系统 系统演示 EntityAccess)--学习笔记

作者头像
郑子铭
发布2022-03-22 16:20:20
1630
发布2022-03-22 16:20:20
举报

学习分享 丨作者 /

这是DotNet NB 公众号的第195篇原创文章

目录

  • 模块拆分
  • EntityAccess

模块拆分

EntityAccess

  • 实体权限
  • 属性权限

实体权限

创建 student

代码语言:javascript
复制
https://localhost:7018/Student/dotnetnb2

获取 student

代码语言:javascript
复制
https://localhost:7018/Student

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

代码语言:javascript
复制
https://localhost:7018/Permission/entity

参数

代码语言:javascript
复制
{
  "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

代码语言:javascript
复制
https://localhost:7018/Permission

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

代码语言:javascript
复制
https://localhost:7018/Student/dotnetnb2

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

代码语言:javascript
复制
if (!createPermission.Intersect(claimValues).Any())
    throw new AuthorizationException();

获取 token

代码语言:javascript
复制
https://localhost:7018/Authentication/login

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

代码语言:javascript
复制
https://localhost:7018/Student/dotnetnb2

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

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

代码语言:javascript
复制
https://localhost:7018/Permission/addtorole?role=admin&permission=student-entity-create

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

代码语言:javascript
复制
https://localhost:7018/Authentication/login

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

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

代码语言:javascript
复制
https://localhost:7018/Student/dotnetnb2

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

代码语言:javascript
复制
https://localhost:7018/Student

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

代码语言:javascript
复制
https://localhost:7018/Student/dotnetnb2

因为之前的 permission 中 delete 为 false

代码语言:javascript
复制
"delete": false,

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

代码语言:javascript
复制
https://localhost:7018/Permission/entity

参数

代码语言:javascript
复制
{
  "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

代码语言:javascript
复制
https://localhost:7018/Permission

直接授权这个 permission 给用户 admin

代码语言:javascript
复制
https://localhost:7018/Permission/addtouser?username=admin&permission=student-entity-create-and-delete

重新获取 token

代码语言:javascript
复制
https://localhost:7018/Authentication/login

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

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

代码语言:javascript
复制
https://localhost:7018/Student/dotnetnb2

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

代码语言:javascript
复制
https://localhost:7018/Student

属性权限

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

代码语言:javascript
复制
https://localhost:7018/Student/addAge/dotnetnb

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

代码语言:javascript
复制
https://localhost:7018/Student/addAge/dotnetnb

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

代码语言:javascript
复制
"members": [
  {
    "memberName": "Age",
    "update": false
  }

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

代码语言:javascript
复制
https://localhost:7018/Permission/entity

参数

代码语言:javascript
复制
{
  "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 属性

代码语言:javascript
复制
https://localhost:7018/Student/addAge/dotnetnb

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

代码语言:javascript
复制
https://localhost:7018/Student

GitHub源码链接:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
    • 模块拆分
      • EntityAccess
        • 实体权限
        • 属性权限
      • GitHub源码链接:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档