16

複数のテーブルで 1 つの認証プロセスと「ユーザー」のみを処理する方法を知りたいです。ユーザー、管理者、アーティスト、チーム管理者の 4 つのユーザー テーブルがあり、すべて特定のフィールドがありますが、これらすべてのユーザーがホームページの 1 つのフォームのみを介して接続し、その後、特定のダッシュボードにリダイレクトされるようにしたいと考えています。

リダイレクトは問題ではなく、追加されたいくつかのルートは機能するはずですが、これをすべて可能にするためにどこを見たり開始したりすればよいか本当にわかりません。

乾杯、
ニコラス。

編集:これが最終的な解決策です(deizelに感謝)

App::import('Component', 'Auth');
class SiteAuthComponent extends AuthComponent {

    function identify($user = null, $conditions = null) {
        $models = array('User', 'Admin', 'Artist');
        foreach ($models as $model) {
            $this->userModel = $model; // switch model
            $this->params["data"][$model] = $this->params["data"]["User"]; // switch model in params/data too
            $result = parent::identify($this->params["data"][$model], $conditions); // let cake do its thing
            if ($result) {
                return $result; // login success
            }
        }
        return null; // login failure
    }
}
4

4 に答える 4

20

CakePHPAuthComponentは、一度に 1 つの「ユーザー」モデルに対する認証のみをサポートします。モデルはAuth::userModelプロパティを設定することで選択されますが、モデルの配列ではなく文字列のみを受け入れます。

userModel次のコードを使用してオンザフライで切り替えることができますが、これには切り替え先のモデルを事前に知っておく必要があります (たとえば、ユーザーはドロップダウンからアカウントの種類を選択する必要があります)。

public function beforeFilter() {
    if (isset($this->data['User']['model'])) {
        $this->Auth->userModel = $this->data['User']['model'];
    }
}

メソッドAuthComponentを上書きしてコアを拡張し、必要な機能を追加して、ループオーバーし、各モデルで認証を試行することができます。AuthComponent::identify()

App::import('Component', 'AuthComponent');
class AppAuthComponent extends AuthComponent {

    function identify($user = null, $conditions = null) {
        $models = array('User', 'Admin', 'Artist', 'TeamAdmin');
        foreach ($models as $model) {
            $this->userModel = $model; // switch model
            $result = parent::identify($user, $conditions); // let cake do it's thing
            if ($result) {
                return $result; // login success
            }
        }
        return null; // login failure
    }
}

このトリックを使用しない限り、拡張 AuthComponent を使用するにAuthは、アプリケーション内の の出現箇所を に置き換える必要があります。AppAuth

于 2010-06-04T13:19:02.193 に答える
0

deizel によって提案され、Nicolas によって変更された最終的な解決策は次のとおりです。

App::import('Component', 'Auth');
class SiteAuthComponent extends AuthComponent {

    function identify($user = null, $conditions = null) {
        $models = array('User', 'Admin', 'Artist');
        foreach ($models as $model) {
            $this->userModel = $model; // switch model
            $this->params["data"][$model] = $this->params["data"]["User"]; // switch model in params/data too
            $result = parent::identify($this->params["data"][$model], $conditions); // let cake do its thing
            if ($result) {
                return $result; // login success
            }
        }
        return null; // login failure
    }
}
于 2014-10-14T07:46:36.203 に答える