学习分享 丨作者 / 郑 子 铭
这是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 分支