使用CASL检查访问时抛出错误- PrismaORM、NestJs、Typescript

b1payxdu  于 2023-06-24  发布在  TypeScript
关注(0)|答案(1)|浏览(190)

在中间件中,我设置了一个访问用户的条件,即用户与经过身份验证的用户在同一个公寓中。该条件如下:can(DirectoryAction.VIEW,'DirectoryUser',{ roles:{ some:{ role:{ unitId:CASL_ROLE.unitId } }} }); DirectoryAction是一个枚举,包含查看、删除或更新等操作。DirectoryUser是我的用户对象的名称。CASL_ROLE是我为经过身份验证的用户角色指定的名称。将unitId视为设备ID。
编译时无异常,studio代码中检测到打字脚本错误。这是一个纯运行时错误:-->“equals”不支持数组和对象的比较
Prisma模式:

model DirectoryUser {
    id          BigInt   @id @default(autoincrement())
    userName    String   @map("user_name")
    password    String
    roles   DirectoryRoleUserMapping[]

    @@map("directory_users")
}

model DirectoryRoleUserMapping {
    id  BigInt          @id @default(autoincrement())
    roleId  BigInt          @map("role_id")
    role    DirectoryRole   @relation(fields: [roleId], references: [id], onDelete: Cascade, onUpdate: Cascade)
    userId  BigInt      @map("user_id")
    user    DirectoryUser   @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: Cascade)

    @@unique([roleId, userId])
    @@map("directory_role_user_mappings")
}

model DirectoryRole {
    id     BigInt    @id @default(autoincrement())
    name   String
    unitId BigInt?   @map("unit_id")
    unit   BmsUnit?  @relation(fields: [unitId], references: [id], onDelete: Cascade, onUpdate: Cascade)
    rank   BigInt

    users  DirectoryRoleUserMapping[]

    @@unique([name, unitId])
    @@map("directory_roles")
}

将一个较不复杂的条件改为(仅此处的条件):{ roles:{ some:{ roleId:CASL_ROLE.id } } }不再抛出错误,但条件不再遵循规范。似乎每次我设置一个对象而不是一个配对密钥时:值在“some”中,则会显示此错误。例如,该条件:{ roles:{ some:{角色:{ id:CASL_ROLE.id } }} }抛出错误,但条件验证的内容与之前的相同。
如果需要,请咨询更多信息!谢谢你的注意!

u3r8eeie

u3r8eeie1#

看起来你遇到了一个问题,'equals'不支持数组和对象的比较。这通常是一个问题,当你试图使用一个'等于'函数的对象或数组类型。在这里,看起来您试图使用CASL(公共访问安全层)的“some”函数进行比较,但它不支持您正在使用的对象复杂性级别。
一个可能的解决方案是将对象扁平化到比较简单的键值对的级别,而不是比较嵌套对象。还应确保比较的是相同类型的对象是否相等。错误消息似乎表明您正在将数组与对象进行比较,这将不起作用。
总之,确保你是在比较苹果和苹果(简单的键值对和简单的键值对),而不是苹果和桔子(数组和对象)。
我没有你的应用程序的完整上下文,但这里是示例prisma模式:

model DirectoryUser {
    id          BigInt   @id @default(autoincrement())
    userName    String   @map("user_name")
    password    String
    roles       DirectoryRoleUserMapping[]

    @@map("directory_users")
}

model DirectoryRoleUserMapping {
    id  BigInt          @id @default(autoincrement())
    roleId  BigInt      @map("role_id")
    role    DirectoryRole   @relation(fields: [roleId], references: [id], onDelete: Cascade, onUpdate: Cascade)
    userId  BigInt      @map("user_id")
    user    DirectoryUser   @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: Cascade)

    @@unique([roleId, userId])
    @@map("directory_role_user_mappings")
}

model DirectoryRole {
    id     BigInt    @id @default(autoincrement())
    name   String
    unitId BigInt?   @map("unit_id")
    unit   BmsUnit?  @relation(fields: [unitId], references: [id], onDelete: Cascade, onUpdate: Cascade)
    rank   BigInt

    users  DirectoryRoleUserMapping[]

    @@unique([name, unitId])
    @@map("directory_roles")
}

相关问题