Охранное многопрофильное объединение - PullRequest
0 голосов
/ 21 февраля 2019

Проблема: компания может связать записи, которые не принадлежат ей, просто сообщив идентификатор в отношении

Сценарий: Мой API-интерфейс состоит из нескольких компаний икаждая компания управляет вашими записями (продукты, заказы ...), но эти компании могут только просматривать и использовать записи, которые принадлежат им.Однако в заказ можно ввести идентификатор продукта другой компании, и он не должен

Пример: Компания Apple может сообщать продукт iPhone только в своих заказах, если онапри попытке сообщить пикселю Google должно появиться сообщение об ошибке

Наблюдения: Надеюсь, мне не нужно проверять каждую запись, связанную с заказом, перед сохранением, поскольку моя действительная схема имеет несколько взаимосвязей (20таблицы, связанные с порядком, примерно 2 уровня каскада), и это только небольшой пример.Было бы очень сложно найти в базе данных каждый продукт и убедиться, что он принадлежит компании.Я думаю, что было бы возможно предотвратить эту запись с некоторой настройкой индекса

Вопрос: Как я могу запретить связывать записи других компаний с текущими записями компании, даже сообщая идентификатор по запросу тела?

Буду признателен за вашу помощь, поскольку в этой ситуации у меня работает система.

company.entity.ts

@Entity()
export class Company {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

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

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

product.entity.ts

@Entity()
export class Product {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  description: string;

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

order.entity.ts

@Entity()
export class Order {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  description: string;

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

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

order.controller.ts

@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 companyId: 1
  • id : 2 описание : Google Pixel companyId: 2

POST http://localhost:3040/orders Запрос кузова: Obs .: heПользователь сообщает iPhone, который является продуктом, который он знает, и заставляет идентификатор продукта 2 быть неизвестным продуктом, потому что API GET проверяет, какие продукты видны Apple, в этом случае только iPhone

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

Body Response: Obs .: даже сообщая продукт другой компании, по возвращении API представлен Google Pixel, который не может быть записан по заказу Apple.Здесь должно появиться сообщение об ошибке

{
    "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

1 Ответ

0 голосов
/ 21 февраля 2019

Необходимо решить две проблемы.Во-первых, отношения «многие ко многим» между заказом и продуктом не ограничивают компанию продукта.Вы, вероятно, можете сделать это, используя правильные декораторы, я полагаю, что вы можете указать информацию о таблицах и столбцах в своем декораторе @JoinTable.

Вторая проблема заключается в том, что должен быть способ связать вызывающего API с компанией, к которой он принадлежит.к.Вы можете сделать это, используя JWT для аутентификации и вставив идентификатор компании в полезную нагрузку JWT.

Надеюсь, это поможет.

...