关于Yii中处理前后台登录的方法实现
这篇文章主要介绍了Yii中实现处理前后台登录的新方法,具体分析了Yii中前后台登录的新思路与相关实现技巧,需要的朋友可以参考下
本文实例讲述了Yii中实现处理前后台登录的新方法。分享给大家供大家参考,具体如下:
因为最近在做一个项目涉及到前后台登录问题,我是把后台作为一个模块(Module)来处理的。我看很多人放两个入口文件index.php和admin.php,然后分别指向前台和后台。这种方法固然很好,可以将前后台完全分离,但我总觉得这种方式有点牵强,这和两个应用啥区别?还不如做两个App用一个framework更好。而且Yii官方后台使用方法也是使用Module的方式。但是Moudle的方式有一个很头疼的问题,就是在使用Cwebuser登录时会出现前后台一起登录一起退出的问题,这显然是不合理的。我纠结了很久才找到下文即将介绍的方法,当然,很多也是参考别人的,自己稍作了改动。我一开始的做法是在后台登录时设置一个isadmin的session,然后再前台登录时注销这个session,这样做只能辨别是前台登录还是后台登录,但做不到前后台一起登录,也即前台登录了后台就退出了,后台登录了前台就退出了。出现这种原因的根本原因是我们使用了同一个Cwebuser实例,不能同时设置前后台session,要解决这个问题就要将前后台使用不同的Cwebuser实例登录。下面是我的做法,首先看protected->config->main.php里对前台user(Cwebuser)的配置:
'user'=>array( 'class'=>'WebUser',//这个WebUser是继承CwebUser,稍后给出它的代码 'stateKeyPrefix'=>'member',//这个是设置前台session的前缀 'allowAutoLogin'=>true,//这里设置允许cookie保存登录信息,一边下次自动登录 ),
在你用Gii生成一个admin(即后台模块名称)模块时,会在module->admin下生成一个AdminModule.php文件,该类继承了CWebModule类,下面给出这个文件的代码,关键之处就在该文件,望大家仔细研究:
<?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( 'admin.models.*', 'admin.components.*', )); //这里重写父类里的组件 //如有需要还可以参考API添加相应组件 Yii::app()->setComponents(array( 'errorHandler'=>array( 'class'=>'CErrorHandler', 'errorAction'=>'admin/default/error', ), 'admin'=>array( 'class'=>'AdminWebUser',//后台登录类实例 'stateKeyPrefix'=>'admin',//后台session前缀 'loginUrl'=>Yii::app()->createUrl('admin/default/login'), ), ), false); //下面这两行我一直没搞定啥意思,貌似CWebModule里也没generatorPaths属性和findGenerators()方法 //$this->generatorPaths[]='admin.generators'; //$this->controllerMap=$this->findGenerators(); } public function beforeControllerAction($controller, $action) { if(parent::beforeControllerAction($controller, $action)) { $route=$controller->id.'/'.$action->id; if(!$this->allowIp(Yii::app()->request->userHostAddress) && $route!=='default/error') throw new CHttpException(403,"You are not allowed to access this page."); $publicPages=array( 'default/login', 'default/error', ); 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==='*' || $filter===$ip || (($pos=strpos($filter,'*'))!==false && !strncmp($ip,$filter,$pos))) return true; } return false; } } ?>
AdminModule 的init()方法就是给后台配置另外的登录实例,让前后台使用不同的CWebUser,并设置后台session前缀,以便与前台session区别开来(他们同事存在$_SESSION这个数组里,你可以打印出来看看)。
这样就已经做到了前后台登录分离开了,但是此时你退出的话你就会发现前后台一起退出了。于是我找到了logout()这个方法,发现他有一个参数$destroySession=true,原来如此,如果你只是logout()的话那就会将session全部注销,加一个false参数的话就只会注销当前登录实例的session了,这也就是为什么要设置前后台session前缀的原因了,下面我们看看设置了false参数的logout方法是如何注销session的:
/** * 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]); } }
看到没,就是利用匹配前缀的去注销的。
到此,我们就可以做到前后台登录分离,退出分离了。这样才更像一个应用,是吧?嘿嘿…
差点忘了说明一下:
Yii::app()->user //前台访问用户信息方法 Yii::app()->admin //后台访问用户信息方法
不懂的仔细看一下刚才前后台CWebUser的配置。
附件1:WebUser.php代码:
<?php class WebUser extends CWebUser { public function __get($name) { if ($this->hasState('__userInfo')) { $user=$this->getState('__userInfo',array()); if (isset($user[$name])) { return $user[$name]; } } return parent::__get($name); } public function login($identity, $duration) { $this->setState('__userInfo', $identity->getUser()); parent::login($identity, $duration); } } ?>
附件2:AdminWebUser.php代码
<?php class AdminWebUser extends CWebUser { public function __get($name) { if ($this->hasState('__adminInfo')) { $user=$this->getState('__adminInfo',array()); if (isset($user[$name])) { return $user[$name]; } } return parent::__get($name); } public function login($identity, $duration) { $this->setState('__adminInfo', $identity->getUser()); parent::login($identity, $duration); } } ?>
附件3:前台UserIdentity.php代码
<?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 'demo'. * 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('username=:username',array(':username'=>$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; } }
附件4:后台UserIdentity.php代码
<?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 'demo'. * 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('username=:username',array(':username'=>$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; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
关于Yii2中使用join和joinwith进行多表关联查询
Atas ialah kandungan terperinci 关于Yii中处理前后台登录的方法实现. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Dengan perkembangan berterusan teknologi pengkomputeran awan, sandaran data telah menjadi sesuatu yang mesti dilakukan oleh setiap perusahaan. Dalam konteks ini, amat penting untuk membangunkan sistem sandaran awan yang sangat tersedia. Rangka kerja PHP Yii ialah rangka kerja berkuasa yang boleh membantu pembangun membina aplikasi web berprestasi tinggi dengan cepat. Berikut akan memperkenalkan cara menggunakan rangka kerja Yii untuk membangunkan sistem sandaran awan yang sangat tersedia. Mereka bentuk model pangkalan data Dalam rangka kerja Yii, model pangkalan data adalah bahagian yang sangat penting. Kerana sistem sandaran data memerlukan banyak jadual dan hubungan

Memandangkan Internet terus berkembang, permintaan untuk pembangunan aplikasi web juga semakin tinggi. Bagi pembangun, membangunkan aplikasi memerlukan rangka kerja yang stabil, cekap dan berkuasa, yang boleh meningkatkan kecekapan pembangunan. Yii ialah rangka kerja PHP berprestasi tinggi terkemuka yang menyediakan ciri yang kaya dan prestasi yang baik. Yii3 ialah versi generasi seterusnya bagi rangka kerja Yii, yang seterusnya mengoptimumkan prestasi dan kualiti kod berdasarkan Yii2. Dalam artikel ini, kami akan memperkenalkan cara menggunakan rangka kerja Yii3 untuk membangunkan aplikasi PHP.

Memandangkan permintaan untuk aplikasi web terus berkembang, pembangun mempunyai lebih banyak pilihan dalam memilih rangka kerja pembangunan. Symfony dan Yii2 ialah dua rangka kerja PHP yang popular Kedua-duanya mempunyai fungsi dan prestasi yang berkuasa, tetapi apabila berhadapan dengan keperluan untuk membangunkan aplikasi web berskala besar, rangka kerja manakah yang lebih sesuai? Seterusnya kami akan menjalankan analisis perbandingan Symphony dan Yii2 untuk membantu anda membuat pilihan yang lebih baik. Gambaran Keseluruhan Asas Symphony ialah rangka kerja aplikasi web sumber terbuka yang ditulis dalam PHP dan dibina di atas

Rangka kerja Yii ialah rangka kerja aplikasi Web PHP sumber terbuka yang menyediakan pelbagai alatan dan komponen untuk memudahkan proses pembangunan aplikasi Web, yang mana pertanyaan data merupakan salah satu komponen penting. Dalam rangka kerja Yii, kita boleh menggunakan sintaks seperti SQL untuk mengakses pangkalan data untuk membuat pertanyaan dan memanipulasi data dengan cekap. Pembina pertanyaan rangka kerja Yii terutamanya termasuk jenis berikut: pertanyaan ActiveRecord, pertanyaan QueryBuilder, pertanyaan arahan dan pertanyaan SQL asal

Dalam era maklumat semasa, data besar, kecerdasan buatan, pengkomputeran awan dan teknologi lain telah menjadi tumpuan perusahaan utama. Di antara teknologi ini, teknologi pemaparan kad grafik, sebagai teknologi pemprosesan grafik berprestasi tinggi, telah mendapat perhatian yang lebih. Teknologi pemaparan kad grafik digunakan secara meluas dalam pembangunan permainan, filem dan kesan khas televisyen, pemodelan kejuruteraan dan bidang lain. Bagi pembangun, memilih rangka kerja yang sesuai dengan projek mereka adalah keputusan yang sangat penting. Antara bahasa semasa, PHP ialah bahasa yang sangat dinamik Beberapa rangka kerja PHP yang sangat baik seperti Yii2, Ph

Jika anda bertanya "Apakah Yii?", lihat tutorial saya sebelum ini: Pengenalan kepada Rangka Kerja Yii, yang menyemak faedah Yii dan menggariskan perkara baharu dalam Yii 2.0, yang dikeluarkan pada Oktober 2014. Hmm> Dalam siri Pengaturcaraan dengan Yii2 ini, saya akan membimbing pembaca menggunakan rangka kerja Yii2PHP. Dalam tutorial hari ini, saya akan berkongsi dengan anda cara memanfaatkan fungsi konsol Yii untuk menjalankan kerja cron. Pada masa lalu, saya telah menggunakan wget - URL yang boleh diakses web - dalam tugas cron untuk menjalankan tugas latar belakang saya. Ini menimbulkan kebimbangan keselamatan dan mempunyai beberapa masalah prestasi. Semasa saya membincangkan beberapa cara untuk mengurangkan risiko dalam siri Keselamatan untuk Permulaan kami, saya berharap untuk beralih kepada arahan yang dipacu konsol

yii框架:本文为大家介绍了yii将对象转化为数组或直接输出为json格式的方法,具有一定的参考价值,希望能够帮助到大家。

Dalam pembangunan perisian moden, membina sistem pengurusan kandungan (CMS) yang berkuasa bukanlah satu tugas yang mudah. Pembangun bukan sahaja perlu mempunyai kemahiran dan pengalaman yang luas, tetapi mereka juga perlu menggunakan teknologi dan alatan yang paling canggih untuk mengoptimumkan fungsi dan prestasi mereka. Artikel ini memperkenalkan cara menggunakan Yii2 dan GrapeJS, dua perisian sumber terbuka yang popular, untuk melaksanakan CMS bahagian belakang dan pengeditan visual bahagian hadapan. Yii2 ialah rangka kerja PHPWeb popular yang menyediakan alatan dan komponen yang kaya untuk dibina dengan cepat
