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 linelines to its main
page. For example, for the Customer module, add to Customer/CustomerModule.php
Add the following linelines 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