找到之前创建的 is 这个 trait ,在它里面我们再添加一个方法可以判断用户是否拥有指定的用户角色 .. 添加一个方法 ... 名字叫 is ..
这个方法做的事情跟我们之前创建的 can 这个 trait 里的 can 这个方法差不多 .. 我们可以给这个 is 方法一个角色或者一组角色 .. 方法根据用户是否拥有指定的用户角色返回 true 或者 false ..
给它一个参数叫 roles ,它的值可以是字符串也可以是一个数组 .. 再添加一个 all ,默认让它等于 false ..
方法里面添加一个 userRoles .. await .. 用一下 this.getRoles() 获取到用户的角色列表 ..
下面判断一下 .. 如果 Array.isArray .. roles ,如果 roles 是数组 .. 添加一个 result ... roles.map .. 当前项目叫 role ... return 的是 userRoles.includes(role) ..
return 的值可以判断一下 all 参数的值,如果是 true,说明用户必须拥有所有指定的角色 .. 这样返回的结果就是 !result.includes(false) ... 不然的话,返回的结果就是 result.includes(true)
如果 roles 是个字符串,要 return 的就是 userRoles.includes .. roles 的结果 ... 也就是看看用户有没有指定的角色,如果有,这个 is 方法就会返回 true,没有就会返回 false ..
然后在这个 trait 的 register 方法里面, Model.prototype 上面添加一个 is ... 让它等于 this.is ...
试验
回到应用的 routes.js ,在 demo/acl 这个路由上可以试一下 ... 添加一个 result ... 用一下 user 上的 is,判断一下这个用户有没有 admin 这个角色 ... 再 return 这个 result ...
回到浏览器 ... 预览一下 ...
出现一个错误,说 userRoles 上面的 includes 不是一个函数 ..
回到项目 .. 这个是因为我们在执行 this.getRoles 的时候,前面忘了加 await ...
回来再试一下 .. 返回的结果是 false ... 表示用户没有指定的角色 ...
再回来试一下 ... 看看 id 号是 1 的这个用户有没有 admin 角色 ...
这次返回的结果是 true,说明有 admin 角色 ...