Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Plumier中创建基于用户权限的可重用自定义授权_Javascript_Node.js_Typescript_Plumier - Fatal编程技术网

Javascript 如何在Plumier中创建基于用户权限的可重用自定义授权

Javascript 如何在Plumier中创建基于用户权限的可重用自定义授权,javascript,node.js,typescript,plumier,Javascript,Node.js,Typescript,Plumier,我在创建可重用到多个控制器中的自定义授权时遇到问题。从示例中可以看出,自定义授权无法重用到具有不同签名的另一个控制器中 在我的例子中,我有一些具有某种角色授权的端点,以防止未经授权的用户访问某些端点 RoomsUsersController POST /rooms/:roomId/users/:userId/kick -> role: RoomAdmin POST /rooms/:roomId/users/:userId/promote -> role: RoomAdmin G

我在创建可重用到多个控制器中的自定义授权时遇到问题。从示例中可以看出,自定义授权无法重用到具有不同签名的另一个控制器中

在我的例子中,我有一些具有某种角色授权的端点,以防止未经授权的用户访问某些端点

RoomsUsersController
POST /rooms/:roomId/users/:userId/kick    -> role: RoomAdmin
POST /rooms/:roomId/users/:userId/promote -> role: RoomAdmin
GET  /rooms/:roomId/users?offset&limit    -> role: RoomAdmin, RoomUser
只有
RoomAdmin
可以踢和提升用户,只有注册的
RoomUser
RoomAdmin
可以查看房间用户列表

我还创建了另一个由另一个控制器处理的速记端点,通过在帖子正文中提供
roomId
来踢和提升用户,如下所示


UsersController
POST /users/:id/kick     body: {roomId}   -> role: RoomAdmin
POST /users/:id/promote  body: {roomId}   -> role: RoomAdmin
RoomsUserController
UsersController
的签名如下(方法体和验证已删除)

@route.root(“/rooms/:roomId/users”)
导出类RoomsUserController{
@route.post(“:userId/kick”)
kick(roomId:string,userId:string){}
@route.post(“:userId/promote”)
升级(roomId:string,userId:string){}
}
导出类UsersController{
@路线柱(“:id/kick”)
kick(id:string,@bind.body()body:{roomId:string}){
@路线。张贴(“:id/promote”)
升级(id:string,@bind.body()body:{roomId:string}){
}
我目前的解决方案是为
RoomsUserController
UsersController
创建不同的自定义授权,但它不那么枯燥,而且看起来很麻烦

//RoomsUserController的自定义授权
函数室用户(…角色:字符串[]){
返回authorize.custom(异步({user,parameters})=>{
const room=await RoomModel.findById(参数[0])。填充(“用户”)
const roomUser=room.users.find(x=>x.userId===user.userId)
如果(!roomUser)抛出新的HttpStatusError(401,“未授权用户”)
返回角色.some(x=>x==roomUser.role)
})
}

参数[0]
将不适用于
UsersController
,因为它具有不同的签名。有人有相同的问题吗?

这是您所需要的
路由属性。其包含有关处理请求的当前控制器/操作的元数据信息。您可以使用
route.action.parameters
etc获取当前操作参数元数据列表,其中包含参数名称、参数类型等,您可以查看完整的模式

控制器的问题是它们之间没有相似性,无法检索自定义授权将使用的
roomId
。您可以修改
用户控制器
,如下所示:

导出类用户控制器{
@路线柱(“:id/kick”)
kick(id:string,roomId:string){}
@路线。张贴(“:id/promote”)
升级(id:string,roomId:string){}
}
注意,您可以将请求正文属性分解为几个参数。上面的代码显示前面的
body:{roomId:string}
参数可以简化为
roomId:string
。如果
body
参数具有更多属性,则可以简单地将它们分解为具有正确名称和类型的参数

现在使用上述控制器,您可以在
userscoontroller
roomsuserscoontroller
之间找到相似性,即
roomId
参数。您现在可以使用
route.action.parameters
访问它们。现在完整的自定义授权如下所示:

功能室用户(…角色:字符串[]){
返回authorize.custom(异步({user,route,parameters})=>{
const index=route.action.parameters.findIndex(x=>x.name==“roomId”)
如果(索引==-1)
抛出新错误(`在中找不到参数roomId
{route.controller.name}.${route.action.name}`)
const room=await RoomModel.findById(参数[index])。填充(“用户”)
const roomUser=room.users.find(x=>x.userId===user.userId)
如果(!roomUser)抛出新的HttpStatusError(401,“未授权用户”)
返回角色.some(x=>x==roomUser.role)
})
}
上面代码的思想是:在操作参数中找到名为
roomId
的参数的位置,然后使用索引从
参数中获取值