问题:公司可以仅通过通知关系中的id来关联与其不相关的记录

场景:我的api是多公司的,每个公司都管理您的记录(产品,订单...),但是这些公司只能查看和使用属于它们的记录。但是,可以在订单中输入其他公司的产品ID,因此不应

示例:如果苹果公司试图通知Google Pixel应该有一些错误消息,则苹果公司只能在其订单中通知iPhone产品

观察:我希望在保存之前不需要验证与该订单相关的每条记录,因为我的实际模式具有多个关系(与一个订单相关联的20个表,一些2级层叠),这只是一个小例子。在数据库中搜索每种产品并验证其是否属于公司将是非常复杂的。我认为可以通过一些索引设置来阻止此记录

问题:如何防止将其他公司的记录与当前公司记录相关联,甚至在报告正文请求时也要报告ID?

感谢您的帮助,因为在这种情况下我正在生产一个系统。

公司实体

@Entity()
export class Company {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @OneToMany(() => Product, (product) => product.company)
  products: Product[];

  @OneToMany(() => Order, (order) => order.company)
  orders: Order[];
}


产品实体

@Entity()
export class Product {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  description: string;

  @ManyToOne(() => Company, (company) => company.products)
  company: Company;
}


订单实体

@Entity()
export class Order {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  description: string;

  @ManyToOne(() => Company, (company) => company.orders)
  company: Company;

  @ManyToMany(() => Product)
  @JoinTable()
  products: Product[];
}


订单控制器

@Controller('orders')
export class OrderController {

  constructor(
    @InjectRepository(Order)
    public repository: Repository<Order>,
  ) { }

  @Post()
  public async create(@Body() body: Order): Promise<Order> {
    body.id = undefined;
    body = await this.repository.save(body);
    return await this.repository.findOne(body.id, { relations: ['products'] });
  }

  @Put(':id')
  public async update(@Param('id') id, @Body() body: Order): Promise<Order> {
    body.id = Number(id);
    await this.repository.save(body);
    return await this.repository.findOne(id, { relations: ['products'] });
  }
}


公司表


id:1说明:苹果
id:2说明:Google


项目表


ID:1说明:iPhone公司ID:1
id:2说明:Google Pixel companyId:2


POST http://localhost:3040/orders
正文要求:
观察:在此用户通知iPhone是他知道的产品,并强制产品ID 2为未知产品,因为api GET验证哪些产品对Apple可见,在这种情况下,只有iPhone

{
    "company": 1,
    "description": "Order 001",
    "products": [
        {
            "id": 1,
            "description": "iPhone"
        },
        {
            "id": 2
        }
    ]
}


身体反应:
观察:即使通知了另一家公司的产品,在api返回时也会显示无法按照苹果的订单记录的Google Pixel。在这里您应该有一条错误消息

{
    "id": 2,
    "description": "Order 001",
    "products": [
        {
            "id": 1,
            "description": "iPhone"
        },
        {
            "id": 2,
            "description": "Google Pixel"
        }
    ]
}


结果表

订单表


id:1说明:订单001 companyId:1


订购产品表


orderId:2 productId:1
orderId:2 productId:2

最佳答案

有两个问题要解决。首先是订单和产品之间的多对多关系并不限制产品的公司。您可能可以使用正确的装饰器来做到这一点,我相信您可以在@JoinTable装饰器中指定表和列信息。

第二个问题是需要一种将API调用程序与其所属公司相关联的方法。您可以通过使用JWT进行身份验证并将公司ID嵌入JWT的有效负载中来执行此操作。

希望这可以帮助。

07-28 02:47
查看更多