まえがき
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としてログインして、このモジュールのすべての魅力を確認できます。 それらについて簡単に:
- 登録、承認、パスワード回復、アカウントのアクティベーションの既製の実装。
- 追加のプロファイルフィールドのメカニズムがあります。 つまり、追加のフィールド、たとえば生年月日、都市、電話などをユーザープロファイルに簡単にねじ込むことができます。 フィールド名、タイプ、コード、デフォルト値、検証用の正規表現を設定したり、標準入力の代わりにウィジェットをハングアップしたりできます。
- モジュール全体の既製の管理インターフェイス(CRUDスタイル)。
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つの素晴らしい国で言うように、出来上がり! すぐに管理インターフェイスを確認してください。 簡単な機能:
- 1人のユーザーに複数のロールをバインドできます。
- 操作はグループ化されています。
- ロールは権限を継承できます。
- はるかに。
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' ) ); }
ユーザーモジュールを更新した後にのみ、動作を復元することを忘れないでください。 将来的にはそのような松葉杖に頼る必要がないように、開発者がコントローラーにイベントを固定することを期待しましょう。
誰かがよりエレガントなソリューションを知っているなら、私は聞いてうれしいです。
ご清聴ありがとうございました。