0

コードのセキュリティを強化するために投票者を使用したいと思います。一部のユーザーだけがアイテムのコレクションを削除できるようにしたい。

ここに私の例があります:
私は記事とその記事に関連付けられたタグを持っています。記事の作成者がその記事に関連付けられたタグを削除できるようにしたい (記事の作成者のみがこれを行うことができます)

私は有権者を使用することを考えていました (ユーザーが記事の作成者であることを確認するため)、インターネットで見つけたすべての例は、小枝またはコントローラーから呼び出された有権者を示しています...コレクションオプションを使用して「許可する-delete" symfony エンティティ Article からメソッド removeTag($tag) を呼び出します。また、有権者に電話をかける方法/場所もわかりません。

4

1 に答える 1

2

答えはこれだけです:

はい、できます。必要な場所にservice.containerを挿入して呼び出します$this->securityContext->isGranted('delete', $tag);

しかし、これはエンティティにサービスを注入する必要があることを意味し、それは完全に間違っています。

別の方法は、 preRemove または onFlush イベントの教義リスナー内でそれを行うことです。これはクールですが、ほとんど間違っています。voter が失敗した場合はどうしますか? 例外をスローすると、教義が破られます。また、ユーザーがいない場合はどうなりますか? その理由は、リスナーではユーザーにフィードバックを簡単に返すことができないからです。

コードベースの他の離れた場所でエラーを作成するリスクなしで、より適切で管理しやすい場所で行うことができるため、より高いレベルの抽象化でエンティティの削除をブロックすることは間違っています。

代わりにこれを試してください:

  • symfony フォームを使用している場合は、次の 2 つのいずれかを実行できます。
    • フォーム制約をサービスとして使用し、ここにセキュリティ コンテキストを挿入して検証を行います。間違っている場合はフォーム エラーを追加します
    • コレクションを親としてサービスとしてカスタム フォームタイプを作成し、security.context を注入し、最後に PRE_SET_DATA でフォーム リスナーを使用して、何かが削除されているかどうかを確認し、現在のユーザーが isGranted で許可されているかどうかを確認します。確認が失敗した場合は、フォーム エラーを追加します。
  • 単一のアクション (API など) でそれを行っている場合は、アクションまたは小枝で直接 isGranted を確認する必要があります。
于 2015-04-15T11:56:14.373 に答える