unchanged
Title
Module based login
If you want to add _module based login_ to a site without using RBAC, please follow these guidelines. Consider the situation where we want to add 3 types of login in a site: customer, dealer, and admin. Start by generating three modules using gii. (To do this, please refer to this guide for module generation [http://yiiframework.com/doc/guide/1.1/en/basics.module#creating-module](http://yiiframework.com/doc/guide/1.1/en/basics.module#creating-module "Creating Modules")) **Step 1** Copy the _UserIdentity_ component to the module/components folder for each module. We will validate each module against its table. For example, customer validation is done using customer table, and admin validation against the admin table For each module, change its _UserIdentity_ authenticate() function to perform the appropriate validation. **Step 2** For each module, add the followinglinelines to its main page. For example, for the Customer module, add to Customer/CustomerModule.php Add the followinglinelines to init(): ~~~ [php] $this->setComponents(array( 'errorHandler' => array( 'errorAction' => 'customer/default/error'), 'user' => array( 'class' => 'CWebUser', 'loginUrl' => Yii::app()->createUrl('customer/default/login'), ) )); Yii::app()->user->setStateKeyPrefix('_customer'); ~~~ **Step 3** Create the login/logout action in each module's _DefaultController_. For example, for the Customer module: Create the actionLogin() in Customer/controllers/DefaultController.php. Also, create actionLogout() as follows: ~~~ [php] public function actionLogout() { Yii::app()->user->logout(false);$this->redirect(Yii::app()->getModule('admin')->user->loginUrl);$this->redirect(Yii::app()->getModule('customer')->user->loginUrl); } ~~~ **Point sub-domain to module** This tips from the forum URL [Subdomain to module](http://www.yiiframework.com/forum/index.php?/topic/7242-subdomain-and-modules/page__p__36698#entry36698 "Subdomain to module") There is a feature called "Parameterizing Hostnames" ([described on this pages](http://www.yiiframework.com/doc/guide/1.1/en/topics.url "described on this pages")). add the following lines to main.php ~~~ [php] 'components' => array( ... 'urlManager' => array( 'rules' => array( 'http://customer.example.com' => 'customer/default/index', 'http://customer.example.com/login' => 'customer/default/login', ), ), ... ), ~~~ So "customer/default/index" refers to the module "customer" with controller "default" and action "index". **Update** ---------- **Redirect to respective module login, if user not logged in to a particular model** add following code to customer module CustomerModule.php in beforeControllerAction ~~~ [php] if(Yii::app()->getModule('customer')->user->isGuest) Yii::app()->getModule('customer')->user->setReturnUrl('customer/default/login'); ~~~ do the same for other module in SiteController's site/login method ~~~ [php] public function actionLogin() { Yii::app()->request->redirect(Yii::app()->createUrl(Yii::app()->user->returnUrl)); } ~~~ **Update 2** ---------- **Redirect to respective module login, if user not logged in to a particular model** add following code to customer module CustomerModule.php ~~~ [php] public function beforeControllerAction($controller, $action) { if (parent::beforeControllerAction($controller, $action)) { // this method is called before any module controller action is performed // you may place customized code here $route = $controller->id . '/' . $action->id; // echo $route; $publicPages = array( 'default/login', 'default/error', ); if (Yii::app()->user->isGuest && !in_array($route, $publicPages)){ Yii::app()->getModule('customer')->user->loginRequired(); } else return true; } else return false; } ~~~ do the same for other module Thanks to ricardograna for sharing some configurations