ホームページ  >  記事  >  バックエンド開発  >  Yii におけるフロントログインとバックログインを処理するメソッドの実装について

Yii におけるフロントログインとバックログインを処理するメソッドの実装について

不言
不言オリジナル
2018-06-19 11:51:371321ブラウズ

この記事では、主に Yii でフロントエンドとバックエンドのログインを処理する新しい方法を紹介し、特に Yii でのフロントエンドとバックエンドのログインの新しいアイデアと関連する実装テクニックを分析します。必要な友人は参照してください。この記事の例へ

# Yii でフロントログインとバックログインを処理する新しい方法について説明します。参考までに、詳細は次のとおりです。

私は現在、フロントエンドとバックエンドのログインの問題を伴うプロジェクトに取り組んでいるため、バックエンドをモジュールとして処理します。多くの人が 2 つのエントリ ファイル、index.php と admin.php を配置し、それぞれフロントエンドとバックエンドを指定しているのを見かけます。この方法はフロントエンドとバックエンドを完全に分離できるので非常に優れていますが、この方法は少し現実離れしているといつも感じます。この方法と 2 つのアプリケーションの違いは何でしょうか。 1 つのフレームワークを使用して 2 つのアプリを作成する方が良いでしょう。また、Yii 公式のバックグラウンド使用方法も Module を使用することです。しかし、Moudle の方法には非常に厄介な問題があります。Cwebuser を使用してログインすると、フロントエンドとバックエンドで同時にログインとログアウトが発生するという問題が発生し、明らかに無理があります。もちろん、以下で紹介する方法を見つけるまでには長い時間がかかりましたが、他の人の方法をベースにしており、少し変更しました。私の最初のアプローチは、バックグラウンドでログインするときに isadmin セッションをセットアップし、フロント デスクにログインするときにセッションからログアウトすることでした。これでは、フロント デスク ログインかバックグラウンド ログインかしかわかりませんでした。フロントとバックエンドの両方にログインできませんでした。つまり、バックグラウンドでログインした後にログアウトし、フロントデスクにログインした後にログアウトしました。この問題の根本的な原因は、同じ Cwebuser インスタンスを使用しており、フロントエンドとバックエンドのセッションを同時にセットアップできないことです。この問題を解決するには、フロントエンドとバックエンドにログインするために異なる Cwebuser インスタンスを使用する必要があります。以下は私のアプローチです。まず、protected->config->main.php のフロントエンド ユーザー (Cwebuser) の構成を確認します。

あなたの場合、Gii を使用して admin (バックエンド モジュール名) モジュールを生成すると、AdminModule.php ファイルが module->admin の下に生成されます。このクラスは CWebModule クラスを継承します。このファイルのコードは次のとおりです。重要な点はこのファイルです。注意深く読んでください:

'user'=>array(
  'class'=>'WebUser',//这个WebUser是继承CwebUser,稍后给出它的代码
  'stateKeyPrefix'=>'member',//这个是设置前台session的前缀
  'allowAutoLogin'=>true,//这里设置允许cookie保存登录信息,一边下次自动登录
),

AdminModule の init() メソッドは、バックエンド用に別のログイン インスタンスを構成することです。フロントとバックエンドで異なる CWebUser を使用できるように、フロント セッションと区別するためにバックグラウンド セッション プレフィックスを設定します (これらは $_SESSION 配列に保存されており、印刷して確認できます)。

このようにフロントエンドとバックエンドのログインが分離されましたが、この時点でログアウトするとフロントエンドとバックエンドが一緒にログアウトしたことになります。そこで、logout() メソッドを見つけたところ、$destroySession=true というパラメーターがあることがわかりました。logout() を実行すると、false パラメーターを追加すると、すべてのセッションがログアウトされることがわかりました。セッションはログアウトされます。このため、セッションをログアウトするために false パラメーターを指定したログアウト メソッドがどのように設定されているかを見てみましょう。

一致するプレフィックスを使用してログアウトしたことが分かりましたか?

この時点で、前後のログインと終了を分離できます。これにより、よりアプリケーションらしくなりますね。ふふ...

説明するのを忘れるところでした:

<?php
class AdminModule extends CWebModule
{
  public function init()
  {
    // this method is called when the module is being created
    // you may place code here to customize the module or the application
    parent::init();//这步是调用main.php里的配置文件
    // import the module-level models and componen
    $this->setImport(array(
      &#39;admin.models.*&#39;,
      &#39;admin.components.*&#39;,
    ));
    //这里重写父类里的组件
    //如有需要还可以参考API添加相应组件
    Yii::app()->setComponents(array(
        &#39;errorHandler&#39;=>array(
            &#39;class&#39;=>&#39;CErrorHandler&#39;,
            &#39;errorAction&#39;=>&#39;admin/default/error&#39;,
        ),
        &#39;admin&#39;=>array(
            &#39;class&#39;=>&#39;AdminWebUser&#39;,//后台登录类实例
            &#39;stateKeyPrefix&#39;=>&#39;admin&#39;,//后台session前缀
            &#39;loginUrl&#39;=>Yii::app()->createUrl(&#39;admin/default/login&#39;),
        ),
    ), false);
    //下面这两行我一直没搞定啥意思,貌似CWebModule里也没generatorPaths属性和findGenerators()方法
    //$this->generatorPaths[]=&#39;admin.generators&#39;;
    //$this->controllerMap=$this->findGenerators();
  }
  public function beforeControllerAction($controller, $action)
  {
    if(parent::beforeControllerAction($controller, $action))
    {
      $route=$controller->id.&#39;/&#39;.$action->id;
      if(!$this->allowIp(Yii::app()->request->userHostAddress) && $route!==&#39;default/error&#39;)
        throw new CHttpException(403,"You are not allowed to access this page.");
      $publicPages=array(
        &#39;default/login&#39;,
        &#39;default/error&#39;,
      );
      if(Yii::app()->admin->isGuest && !in_array($route,$publicPages))
        Yii::app()->admin->loginRequired();
      else
        return true;
    }
    return false;
  }
  protected function allowIp($ip)
  {
    if(empty($this->ipFilters))
      return true;
    foreach($this->ipFilters as $filter)
    {
      if($filter===&#39;*&#39; || $filter===$ip || (($pos=strpos($filter,&#39;*&#39;))!==false && !strncmp($ip,$filter,$pos)))
        return true;
    }
    return false;
  }
}
?>

理解できない場合は、の構成を詳しく見てください。先ほどの表と裏の CWebUser。

添付ファイル 1: WebUser.php コード:

/**
* Clears all user identity information from persistent storage.
 * This will remove the data stored via {@link setState}.
 */
public function clearStates()
{
  $keys=array_keys($_SESSION);
  $prefix=$this->getStateKeyPrefix();
  $n=strlen($prefix);
  foreach($keys as $key)
  {
    if(!strncmp($key,$prefix,$n))
      unset($_SESSION[$key]);
  }
}

添付ファイル 2: AdminWebUser.php コード

Yii::app()->user //前台访问用户信息方法
Yii::app()->admin //后台访问用户信息方法

添付 3: フロントエンド UserIdentity.php コード

<?php
class WebUser extends CWebUser
{
  public function __get($name)
  {
    if ($this->hasState(&#39;__userInfo&#39;)) {
      $user=$this->getState(&#39;__userInfo&#39;,array());
      if (isset($user[$name])) {
        return $user[$name];
      }
    }
    return parent::__get($name);
  }
  public function login($identity, $duration) {
    $this->setState(&#39;__userInfo&#39;, $identity->getUser());
    parent::login($identity, $duration);
  }
}
?>

添付 4: バックエンド UserIdentity.php コード

<?php
class AdminWebUser extends CWebUser
{
  public function __get($name)
  {
    if ($this->hasState(&#39;__adminInfo&#39;)) {
      $user=$this->getState(&#39;__adminInfo&#39;,array());
      if (isset($user[$name])) {
        return $user[$name];
      }
    }
    return parent::__get($name);
  }
  public function login($identity, $duration) {
    $this->setState(&#39;__adminInfo&#39;, $identity->getUser());
    parent::login($identity, $duration);
  }
}
?>

上記は内容全体ですこの記事が皆さんの学習に役立つことを願っています。その他の関連コンテンツについては、PHP 中国語 Web サイトに注目してください。 関連する推奨事項:

Yii2 での複数テーブル関連付けクエリでの join および joinwith の使用について

Yii2 WeChat の使用についてバックエンド 開発された分析


#

以上がYii におけるフロントログインとバックログインを処理するメソッドの実装についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。