少し前にSymfony2を取り上げました。 それ以前は、Zend1とのコミュニケーションにおいてかなり豊富な経験があったという事実にもかかわらず、私にとっては参入障壁が高いことが判明しました。 十分に読んで、何かが私のためにうまくいき始めました。 最大の問題は、アクセス権の制限の問題が原因でした。 ほとんどすべての検索で、フレームワークの標準配信からセキュリティモジュールの機能を拡張する方法に関するFOSUserBundleまたはスニペットの情報に移動しました。 かさばるFOSUserBundleには、自分には利点がありませんでした。 したがって、この記事では、Symfony2セキュリティを自分のニーズに合わせてどのように仕上げたかについて説明します。 目標は次のとおりでした:symfony2 +セキュリティ+ユーザーの役割に応じたオブジェクトレベルでのアクセス権の区別。 この記事では、ロールと累積特権の継承については説明しません。これらの情報は簡単に見つけることができます。 私のプロジェクトの権利スキーム:許可されていないものはすべて禁止されています。 1人のユーザーには厳密に1つの役割があります。 ロールは、異なる特権セットを持つさまざまなリソースにアクセスできます。 異なるロールは、異なるまたは同等の特権セットで同じリソースにアクセスできます。 コードをできる限り抽象化しようとはしませんが、サービス機器の注文注文の機能に関連するプロジェクトの断片を使用します。
要するに。
プロジェクトが正しく構成され、その中にBackendWorkorderBundleが作成され、すべてのルーターとファイアウォールが構成されています。 つまり アクセス権以外のすべてがあります。 認証を含む。 データベース設計には、MySQL
Workbenchツールが使用されました。 素晴らしいもの。 Linux用のバージョンがあります。 テーブル構造は次のようになります。
特権を確認する方法は2つあります。
1.小枝
is_granted('[ ]', [])
から
is_granted('[ ]', [])
2.コントローラーから
$this->get('security.context')->isGranted('[ ]', [])
2番目の引数はオプションですが、私のプロジェクトの目的に必要です(投票者コードでもう少し低くなります)。 htmlページからオブジェクトを除外しても、コントローラーでのデータ検証はキャンセルされません。
有権者コード。 プロジェクトには、バックエンド全体の最も一般的な機能を組み込んだ別のBackendCoreBundleバンドルがあることを忘れていました。 有権者の詳細については、
こちらをご覧
ください 。
<?php
ユーザーのgetPrivileges関数は、backend_userテーブルに関連付けられたdoctrineオブジェクトで宣言されます
<?php
/app/config/security.ymlに有権者を登録します
services: security.access.privilege_voter: class: Backend\CoreBundle\Security\Authorization\Voter\PrivilegeVoter public: false tags: - { name: security.voter }
おそらく、$ object-> getResourceId()が投票関数で呼び出されることに気づいたでしょう。 メソッドは次のようになります
<?php
それだけです! 誰かがこのアプローチの短所とスケーリングの問題の可能性を指摘できるなら、いつものように批判を歓迎します-私はとても幸せです。