2017-09-09 5 views
0

私はSymfony3でAPIバックエンドを構築しようとしており、オブジェクト(この例ではUser)を更新するためにフィールドレベルの権限をPUTエンドポイントに適用する方法について質問があります。 PUT要求は/ユーザー/ {にuserId}エンドポイントに送信される場合Symfony3エンティティフィールドレベルの権限

マイユーザエンティティは、Iが配列に要求JSONをデシリアライズ等

複数のフィールド、のfirstName、lastNameの、ユーザ名を有し、通過配列(およびデータベースからフェッチされたUser)を、リクエストデータをUserプロパティに適用するノーマライザに変換します。

私はADMINがすべてのフィールドを更新できるようにしたいと考えていますが、ユーザー自身が最初と最後の名前のみを更新できるようにしたいと思います。

私のコードのどこかで、Userオブジェクトに更新を適用する前にチェックする必要があります。ユーザー名フィールドがPUTリクエストに存在する場合、そのアップデートをユーザーオブジェクトに適用する前に、要求しているユーザーが管理者であるかどうかを確認する必要があります。

ノーマライザーにセキュリティを注入するのは明らかな解決策のようですが、セキュリティはノーマライザーの関心事ではないはずです。

リクエストをデシリアライズした後、ノーマライザに渡す前にパーミッションをチェックし、ユーザがアクセス権を持たない場合は配列からフィールドを削除することができます。そうでなければadminから[username]を削除します。これを達成するための正しい方法についての考え/提案を探してい

....

ありがとう!

答えて

1

は、私が#symfony IRCに入ったいくつかのフィードバックを投稿する募集:

私は、ユーザーに正規化書き込みを持っていないでしょう。 ノーマライザにDTOを生成させて、ターゲットユーザとユーザがアクションをとって 権限を与えていることを検証します。

バリデーターが失敗した場合は、すべてを投げ捨てて 権限拒否エラーを返します。そうでない場合は、ユーザーにDTOを適用して を保持します。

"バリデーター"はフォーム( に対応するフォームを作成してください。アクティブユーザーとターゲットユーザーが指定したフィールドを変更してください; が追加フィールドである場合はフォームは無効です)。またはセキュリティの有権者でもよいし、 独自のカスタムメカニズムでもよい。