Difference between #11 and #10 of Module based login

unchanged
Title
Module based login
unchanged
Category
Tutorials
unchanged
Tags
authentication, module
changed
Content
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 following lines to its main page. For example, for the
Customer module, add to Customer/CustomerModule.php  Add the following lines 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('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));
    }
~~~
(or)
**Update 2**2 (best method)**
----------

**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