まえがき
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(
次に、/ 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スタイル)。
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;'),
yiitest /?R = rightsページ
をリロードし、再びスーパーユーザーとしてログインするように求められたら、ID = 1のユーザー(この例ではadmin:admin)としてログインします。 そして、彼らが1つの素晴らしい国で言うように、出来上がり! すぐに管理インターフェイスを確認してください。 簡単な機能:
- 1人のユーザーに複数のロールをバインドできます。
- 操作はグループ化されています。
- ロールは権限を継承できます。
- はるかに。
ルールを機能させるには、コントローラーがRControllerクラスを継承する必要があり、それにフィルターメソッドを追加(または追加)する必要があります(コントローラー)
public function filters(){ return array(
甘いもの
これはもちろん非常にクールですが、このスキーム全体では小さなバグバッグが忍び込みました(開発者は予見していなかったか、まだ何も学んでいません)。 つまり、登録後、ユーザーを手動で認証済みロールに設定する必要があります。 このために、私は小さな松葉杖を書きました。 componentsフォルダーの「user」モジュールで、次の内容のOnAfterRegistrationBehavior.phpファイルを作成します。
class OnAfterRegistrationBehavior extends CActiveRecordBehavior{ function afterSave($event){
次に、動作「OnAfterRegistrationBehavior」を「RegistrationForm」モデルに追加します
public function behaviors(){ return array( 'OnAfterRegistrationBehavior' => array( 'class' => 'application.modules.user.components.OnAfterRegistrationBehavior' ) ); }
ユーザーモジュールを更新した後にのみ、動作を復元することを忘れないでください。 将来的にはそのような松葉杖に頼る必要がないように、開発者がコントローラーにイベントを固定することを期待しましょう。
誰かがよりエレガントなソリューションを知っているなら、私は聞いてうれしいです。
ご清聴ありがとうございました。