这章准备将用户权限做一下,想到哪做到哪,愉快的开始了~
一、创建登录用户表Customer
进入loopback应用根目录,添加一个基于User模型的扩展模型Customer,用于用户登录和获取token用,输入命令lb model(loopback创建模型是真心方便)
lb model
请输入模型名称: Customer
选择要向其附加 Customer 的数据源: MongoDB (mongodb)
选择模型的基类 User
通过 REST API 公开 Customer? Yes
定制复数形式(用于构建 REST URL):
公共模型或仅服务器? 公共
创建好Customer模型后,再给Customer添加几个用户的基本属性
firstname - string,非必填,缺省空
lastname - string,非必填,缺省空
image - string,非必填,缺省空
因为基于User基类,所以用户名和密码啥的就不用加了,完成后生成customer.json数据模型,如果在生成时输入或者写错了,可以直接修改模型文件
common/models/customer.json
二、添加用户权限
进入终端输入lb acl开始添加用户权限
lb acl
我的思路比较粗暴,先关闭所有权限,然后按需逐个打开
1、关闭所有访问权限
选择要应用 ACL 条目的模型: (所有现有模型)
选择 ACL 作用域: 所有方法和属性
选择访问类型: 全部(匹配所有类型)
选择角色 所有用户
选择要应用的许可权 明确拒绝访问
设置完后可以到数据common/models/下打开json文件查看数据模型,所有的数据模型文件都多了这块东西,这玩意儿就是刚刚加的权限了
"acls": [ { "accessType": "*", "principalType": "ROLE", "principalId": "$everyone", "permission": "DENY" } ],
2、打开所有用户读取权限
选择要应用 ACL 条目的模型: (所有现有模型)
选择 ACL 作用域: 所有方法和属性
选择访问类型: 读取
选择角色 所有用户
选择要应用的许可权 明确授权访问
3、仅认证用户可以创建checklist(用户登录成功后即为认证用户)
选择要应用 ACL 条目的模型: checklist
选择 ACL 作用域: 单个方法
输入方法名称 create
选择角色 任何已认证的用户
选择要应用的许可权 明确授权访问
4、仅认证用户可以创建item
前面忘记创建数据模型了,这里补充上
lb model
======= 添加模型 =======
请输入模型名称: item
选择要向其附加 item 的数据源: MongoDB (mongodb)
选择模型的基类 PersistedModel
通过 REST API 公开 item? Yes
定制复数形式(用于构建 REST URL):
公共模型或仅服务器? 公共
======= 添加3个属性 =======
属性名称: name
属性类型: string
是否为必需? Yes
缺省值[对于无,保留为空白]: untitled
属性名称: type
属性类型: string
是否为必需? Yes
缺省值[对于无,保留为空白]: item
属性名称: checked
属性类型: boolean
是否为必需? Yes
缺省值[对于无,保留为空白]: false
选择要应用 ACL 条目的模型: item
选择 ACL 作用域: 单个方法
输入方法名称 create
选择角色 任何已认证的用户
选择要应用的许可权 明确授权访问
这里要注意一下,因为这个item模型是后期建的,而前面两步的授权已经做过了,因此新建出来的模型里不会包含前面的授权,最简单的方法是,打开common/models/item.json文件,从其他模型文件复制前两步的权限配置,到acls里面即可,我item.json修改后是这样的
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "DENY"
},
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW"
},
{
"accessType": "EXECUTE",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW",
"property": "create"
}
],
5、创建用户
任何人都可以注册为用户,因此要将创建用户的权限开放给所有人,打开终端lb acl执行
选择要应用 ACL 条目的模型: Customer
选择 ACL 作用域: 单个方法
输入方法名称 create
选择角色 所有用户
选择要应用的许可权 明确授权访问
三、用户注册和用户登录
基本权限设置好了,我们来测试一下是否设置成功
1、用户注册
打开浏览器,输入http://localhost:3000/explorer,展开Customers,找到POST的方法,输入注册用户的基本信息,点击Try it out!按钮进行提交
{
"firstname": "Samsun",
"lastname": "Xu",
"image": "",
"username": "sam",
"password": "password",
"email": "sam@local.host"
}
Customer数据模型有3个属性,其他属性是基于User数据模型,提交成功后,Response Body会反馈如下信息,生成了id就说明用户注册成功了
{
"firstname": "Samsun",
"lastname": "Xu",
"image": "",
"username": "sam",
"email": "sam@local.host",
"id": "6253c3496b6f30b909da1bff"
}
2、用户登录
找到POST /Customers/login的方法,输入刚刚注册时用户名和密码
{
"username":"sam",
"password":"password"
}
登录成功后,反馈如下信息,这里的id其实就是用户的访问令牌accessToken,如果要测试需要认证用户权限的接口,请复制好token
{
"id": "nnTP5dliAWUSO4wDK6wR1LHC29yifdSek3ec67EShuG1fE8O1BKwUYrSBnEmNPBv",
"ttl": 1209600,
"created": "2022-04-11T06:10:13.083Z",
"userId": "6253c3496b6f30b909da1bff"
}
四、权限测试
已经注册了一个用户了,现在测试一下我们刚刚的权限是否设置成功。
试着创建一个checklist,找到POST /checklist的方法,输入清单的名称
{
"title": "旅行清单"
}
提交后,会返回401错误
{
"error": {
"statusCode": 401,
"name": "Error",
"message": "需要授权",
"code": "AUTHORIZATION_REQUIRED",
"stack": "Error: 需要授权\n at ....."
}
}
拿着前面登录接口获得的token,在LoopBack API Explorer的页面顶部设置token
设置好token后,回到POST /checklist的方法,重新提交一下,id返回了说明就创建成功了
{
"title": "旅行清单",
"id": "6253ce03970c51bc2ca4bcca"
}
到这里,基本权限也测试完成了,到目前为止还没写过什么正经代码,真的非常的方便