yii-user拡張機能と権利拡張機能を連携させる方法は?

まえがき



Khabravchiansへの一日の良い時間。



まず、自己紹介をしてください。 私の名前はRomanです。私はサイトの開発に携わっています(主に「yii」phpフレームワークを使用していますが、他のphp \ pythonフレームワーク/ cms \ bikes \ bydloodsもスキップします)。 yiiのプロジェクトでは、登録、承認などの些細な機能をすべて実装する必要があります。 さらに、これにさまざまなユーザーのアクセス権の分布を追加します。 すべてのインテリジェント開発者は、この機能を実装するためのプレハブを少なくとも1つ持っているか、サードパーティの拡張機能を使用しているに違いありません。 そのため、プロジェクトごとに同じ実装を使用するたびに、それを完成させ、システムの他の部分と統合しました。 しかし最近、私は自分のニーズを満たす既製のソリューションの方向を掘り下げることに決めました。それらはすぐに見つかりました。 公式リポジトリにある yiiの2つの最も一般的な拡張機能は、 「yii-user」「rights」です。



統合



両方の拡張機能はモジュールとして設計されています。 したがって、既存のプロジェクトに簡単に統合できます(プロジェクトに既に「ユーザー」モジュールと「権利」モジュールがある場合はバックアップを作成します)が、クリーンさのために、それらを新しいアプリケーションに接続します。 最初に作成する必要があります。その方法については、 ドキュメントで詳しく説明されています 。 アドオンをダウンロードし、/ protected / modulesフォルダーに展開します(存在しない場合があります。手動で作成します)。 今回のプロジェクトには、「ユーザー」と「権利」という2つの新しいモジュールがあります。 構成(/protected/config/main.php)でそれらを有効にします。

'import'=>array( #... 'application.modules.user.*', 'application.modules.user.models.*', 'application.modules.user.components.*', 'application.modules.rights.*', 'application.modules.rights.models.*', 'application.modules.rights.components.*', #... ), 'modules'=>array( #... 'user' => array( //     ,    'tableUsers' => 'tbl_users', 'tableProfiles' => 'tbl_profiles', 'tableProfileFields' => 'tbl_profiles_fields', ), 'rights', #... ), 'components'=>array( #... 'user'=>array( 'class' => 'RWebUser', 'allowAutoLogin'=>true, ), 'authManager'=>array( 'class'=>'RDbAuthManager', 'defaultRoles' => array('Guest') //   ), #... ),
      
      





次に、/ protected / modules / user / data / schema.mysql.sqlおよび/protected/modules/user/data/schema.sqファイルからmysqlデータベースにテーブルを作成します。

やった! モジュールが正常にインストールされました。 確認します。 リンクyiitest /?R = userをたどると表示されます-



デフォルトでは、モジュールをインストールすると、2人のユーザーが作成されます-adminおよびdemoパスワードをそれぞれ持つadminおよびdemo。 admin:adminとしてログインして、このモジュールのすべての魅力を確認できます。 それらについて簡単に: yiitest /?R = rightsを確認してください。 しかし、驚いたことに、エラーメッセージ403 「少なくとも1人のスーパーユーザーが必要です!」が表示されます。 管理者の下での単純な認証はここでは機能しません。 モジュールは引き続きスーパーユーザーの承認を必要とします。 彼を任命する方法は? 権利モジュールには、デフォルト値を追加するために必要なインストーラーがまだありますが、そのうち、現在のユーザーへのスーパーユーザーステータスのバインドです(デフォルトでは、インストーラーは利用できません。モジュール設定で構成する必要があります)。 ただし、インストーラーは無視し、実際のJediと同様に、次のリクエストを実行します。
 INSERT INTO `AuthItem` (`name`, `type`, `description`, `bizrule`, `data`) VALUES ('Admin', 2, '', NULL, 'N;'), ('Authenticated', 2, ' ', NULL, 'N;'), ('Guest', 2, '', NULL, 'N;'); INSERT INTO `AuthAssignment` (`itemname`, `userid`, `bizrule`, `data`) VALUES ('Admin', '1', NULL, 'N;'), --  1    ID  (     ) ('Authenticated', '2', NULL, 'N;');
      
      





yiitest /?R = rightsページをリロードし、再びスーパーユーザーとしてログインするように求められたら、ID = 1のユーザー(この例ではadmin:admin)としてログインします。 そして、彼らが1つの素晴らしい国で言うように、出来上がり! すぐに管理インターフェイスを確認してください。 簡単な機能: ルールを機能させるには、コントローラーがRControllerクラスを継承する必要があり、それにフィルターメソッドを追加(または追加)する必要があります(コントローラー)
 public function filters(){ return array( #..., 'rights' ); }
      
      







甘いもの



これはもちろん非常にクールですが、このスキーム全体では小さなバグバッグが忍び込みました(開発者は予見していなかったか、まだ何も学んでいません)。 つまり、登録後、ユーザーを手動で認証済みロールに設定する必要があります。 このために、私は小さな松葉杖を書きました。 componentsフォルダーの「user」モジュールで、次の内容のOnAfterRegistrationBehavior.phpファイルを作成します。
 class OnAfterRegistrationBehavior extends CActiveRecordBehavior{ function afterSave($event){ //     $assignmentTable = Yii::app()->getAuthManager()->assignmentTable; //     $attr = $event->sender->getAttributes(); //         rights $defRole = Yii::app()->getModule('rights')->authenticatedName; //   Yii::app()->db->createCommand( "INSERT INTO {$assignmentTable} (`itemname`,`userid`,`bizrule`,`data`) VALUES ('{$defRole}','{$attr['id']}',NULL,'N;')")->execute(); } }
      
      





次に、動作「OnAfterRegistrationBehavior」を「RegistrationForm」モデルに追加します
 public function behaviors(){ return array( 'OnAfterRegistrationBehavior' => array( 'class' => 'application.modules.user.components.OnAfterRegistrationBehavior' ) ); }
      
      



ユーザーモジュールを更新した後にのみ、動作を復元することを忘れないでください。 将来的にはそのような松葉杖に頼る必要がないように、開発者がコントローラーにイベントを固定することを期待しましょう。

誰かがよりエレガントなソリューションを知っているなら、私は聞いてうれしいです。



ご清聴ありがとうございました。



All Articles