Heim  >  Artikel  >  Backend-Entwicklung  >  Informationen zur Implementierung der Methode zur Handhabung der Front- und Back-Anmeldung in Yii

Informationen zur Implementierung der Methode zur Handhabung der Front- und Back-Anmeldung in Yii

不言
不言Original
2018-06-19 11:51:371310Durchsuche

In diesem Artikel wird hauptsächlich die neue Methode zur Handhabung der Front-End- und Back-End-Anmeldung in Yii vorgestellt und insbesondere die neuen Ideen und zugehörigen Implementierungstechniken der Front-End- und Back-End-Anmeldung in Yii analysiert zum Beispiel dieses Artikels

Beschreibt die neue Methode zur Handhabung von Front- und Back-Logins in Yii. Ich möchte es Ihnen als Referenz mitteilen:

Da ich derzeit an einem Projekt arbeite, das Anmeldeprobleme im Front- und Backend beinhaltet, behandle ich das Backend als Modul. Ich sehe viele Leute, die zwei Eintragsdateien index.php und admin.php ablegen und dann auf das Frontend bzw. Backend verweisen. Obwohl diese Methode sehr gut ist, kann sie das Front- und Backend vollständig trennen, aber ich habe immer das Gefühl, dass diese Methode etwas weit hergeholt ist. Was ist der Unterschied zwischen dieser und den beiden Anwendungen? Es ist besser, zwei Apps mit einem Framework zu erstellen. Und die offizielle Yii-Backend-Nutzungsmethode ist auch die Verwendung von Module. Die Methode von Moudle weist jedoch ein sehr problematisches Problem auf: Wenn Sie sich mit Cwebuser anmelden, werden sich Front- und Backend gleichzeitig an- und abmelden, was offensichtlich unvernünftig ist. Es hat lange gedauert, bis ich die unten vorgestellte Methode gefunden habe. Natürlich basierten viele davon auf den Methoden anderer Leute und ich habe geringfügige Änderungen vorgenommen. Mein erster Ansatz bestand darin, beim Anmelden im Hintergrund eine isadmin-Sitzung einzurichten und mich dann beim Anmelden an der Rezeption von der Sitzung abzumelden. Dadurch konnte nur festgestellt werden, ob es sich um eine Anmeldung an der Rezeption oder eine Anmeldung im Hintergrund handelte Es war nicht möglich, sich sowohl im Front- als auch im Backend anzumelden, d. Die Hauptursache für dieses Problem besteht darin, dass wir dieselbe Cwebuser-Instanz verwenden und nicht gleichzeitig Front- und Backend-Sitzungen einrichten können. Um dieses Problem zu lösen, müssen wir unterschiedliche Cwebuser-Instanzen verwenden, um uns am Front- und Backend anzumelden. Das Folgende ist mein Ansatz. Schauen Sie sich zunächst die Konfiguration des Front-End-Benutzers (Cwebuser) in protected->config->main.php an:

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

Wenn Sie Gii zum Generieren eines Admin-Moduls (d. h. eines Hintergrundmodulnamens) verwenden, wird unter module->admin eine AdminModule.php-Datei generiert. Diese Klasse erbt die CWebModule-Klasse. Der entscheidende Punkt ist diese Datei. Ich hoffe, Sie lesen sie sorgfältig:

<?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;
  }
}
?>

Die init()-Methode von AdminModule besteht darin, eine weitere Anmeldeinstanz für das Backend zu konfigurieren , damit das Front- und Backend unterschiedliche CWebUser verwenden können, und legen Sie das Hintergrundsitzungspräfix fest, um es von der Frontsitzung zu unterscheiden (sie werden im Array $_SESSION gespeichert, Sie können es ausdrucken, um es anzuzeigen).

Auf diese Weise wurden die vorderen und hinteren Anmeldungen getrennt. Wenn Sie sich jedoch zu diesem Zeitpunkt abmelden, werden Sie feststellen, dass sich die vorderen und hinteren Anmeldungen gleichzeitig abgemeldet haben. Also habe ich die Methode logout() gefunden und festgestellt, dass sie einen Parameter $destroySession=true hat. Es stellt sich heraus, dass alle Sitzungen abgemeldet werden, wenn Sie einen falschen Parameter hinzufügen, nur die aktuelle Anmeldeinstanz wird abgemeldet. Aus diesem Grund müssen die Präfixe für die vordere und hintere Sitzung festgelegt werden. Sehen wir uns an, wie die Abmeldemethode mit dem Parameter „false“ eingestellt wird, um die Sitzung abzumelden:

/**
* 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]);
  }
}

Haben Sie gesehen, dass Sie zum Abmelden das passende Präfix verwenden?

An dieser Stelle können wir die Anmeldung und Abmeldung von Front- und Backend trennen. Das macht es eher zu einer Anwendung, oder? Hehe...

Ich hätte fast vergessen zu erklären:

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

Wenn Sie es nicht verstehen, schauen Sie sich die Konfiguration von genauer an Der vordere und hintere CWebUser gerade jetzt.

Anhang 1: WebUser.php-Code:

<?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);
  }
}
?>

Anhang 2: AdminWebUser.php-Code

<?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);
  }
}
?>

Anhang 3: Front-End-UserIdentity.php-Code

<?php
/**
 * UserIdentity represents the data needed to identity a user.
 * It contains the authentication method that checks if the provided
 * data can identity the user.
 */
class UserIdentity extends CUserIdentity
{
  /**
   * Authenticates a user.
   * The example implementation makes sure if the username and password
   * are both &#39;demo&#39;.
   * In practical applications, this should be changed to authenticate
   * against some persistent user identity storage (e.g. database).
   * @return boolean whether authentication succeeds.
   */
  public $user;
  public $_id;
  public $username;
  public function authenticate()
  {
    $this->errorCode=self::ERROR_PASSWORD_INVALID;
    $user=User::model()->find(&#39;username=:username&#39;,array(&#39;:username&#39;=>$this->username));
     if ($user)
    {
      $encrypted_passwd=trim($user->password);
      $inputpassword = trim(md5($this->password));
      if($inputpassword===$encrypted_passwd)
      {
        $this->errorCode=self::ERROR_NONE;
        $this->setUser($user);
        $this->_id=$user->id;
        $this->username=$user->username;
        //if(isset(Yii::app()->user->thisisadmin))
          // unset (Yii::app()->user->thisisadmin);
      }
      else
      {
        $this->errorCode=self::ERROR_PASSWORD_INVALID;
      }
    }
    else
    {
      $this->errorCode=self::ERROR_USERNAME_INVALID;
    }
    unset($user);
    return !$this->errorCode;
  }
  public function getUser()
  {
    return $this->user;
  }
  public function getId()
  {
    return $this->_id;
  }
  public function getUserName()
  {
    return $this->username;
  }
  public function setUser(CActiveRecord $user)
  {
    $this->user=$user->attributes;
  }
}

Anhang 4: Backend-UserIdentity.php-Code

<?php
/**
 * UserIdentity represents the data needed to identity a user.
 * It contains the authentication method that checks if the provided
 * data can identity the user.
 */
class UserIdentity extends CUserIdentity
{
  /**
   * Authenticates a user.
   * The example implementation makes sure if the username and password
   * are both &#39;demo&#39;.
   * In practical applications, this should be changed to authenticate
   * against some persistent user identity storage (e.g. database).
   * @return boolean whether authentication succeeds.
   */
  public $admin;
  public $_id;
  public $username;
  public function authenticate()
  {
    $this->errorCode=self::ERROR_PASSWORD_INVALID;
    $user=Staff::model()->find(&#39;username=:username&#39;,array(&#39;:username&#39;=>$this->username));
     if ($user)
    {
      $encrypted_passwd=trim($user->password);
      $inputpassword = trim(md5($this->password));
      if($inputpassword===$encrypted_passwd)
      {
        $this->errorCode=self::ERROR_NONE;
        $this->setUser($user);
        $this->_id=$user->id;
        $this->username=$user->username;
        // Yii::app()->user->setState("thisisadmin", "true");
      }
      else
      {
        $this->errorCode=self::ERROR_PASSWORD_INVALID;
      }
    }
    else
    {
      $this->errorCode=self::ERROR_USERNAME_INVALID;
    }
    unset($user);
    return !$this->errorCode;
  }
  public function getUser()
  {
    return $this->admin;
  }
  public function getId()
  {
    return $this->_id;
  }
  public function getUserName()
  {
    return $this->username;
  }
  public function setUser(CActiveRecord $user)
  {
    $this->admin=$user->attributes;
  }
}

Das Obige ist das Ganze Ich hoffe, dass der Inhalt dieses Artikels für das Lernen aller hilfreich ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website!

Verwandte Empfehlungen:

Informationen zur Verwendung von Join und Joinwith für Abfragen mit mehreren Tabellen in Yii2

Informationen zur Verwendung von Yii2 WeChat Backend Entwickelte Analyse

Das obige ist der detaillierte Inhalt vonInformationen zur Implementierung der Methode zur Handhabung der Front- und Back-Anmeldung in Yii. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn