Revision #2 has been created by seenivasan on Apr 16, 2013, 7:18:32 PM with the memo:
Few typos corrected.
« previous (#1)
Changes
Title
unchanged
Yet another implementation of CPhpAuthManager.
Category
unchanged
How-tos
Yii version
unchanged
Tags
changed
RBAC, bizRule, CPhpAuthManager, Authentication
Content
changed
In this wiki, I try to implement a simple authorization schema without putting much logic inside a file
or into database table. We are constructing authorization hierarchy inside the controller. We are getting
roles for the current user from database table and assigning
the only roles to user that are declared in the
particular controller. We have brought down the work of loading of auth data at main
application level to controller level. This way we have pulverised
the auth data for
wholentire site into smaller
units.
LastFinally we are going to look
intoat couple of examples.
1. Induct the component into the application.[...]
-------------------------------
By making some changes in the UserIdentity file in components folder, we can assign a unique id for
individual user. Now_ _Yii::app()->user->id_
would fetch the unique id.
_protected/components/UserIdentity.php_[...]
if($user===null)
$this->errorCode=self::ERROR_USERNAME_INVALID;
elseif($user->password!==md5($this->password."yourpasswordsomeSalt"))
$this->errorCode=self::ERROR_PASSWORD_INVALID;
else
{
$this->errorCode=self::ERROR_NONE;
$this->_id=$user->id;
//Here we are assigning pk of
$user as user I
dD.
}
return !$this->errorCode;[...]
$auth->createOperation('updatePost','update a post');
$auth->createOperation('deletePost','delete a post');
$auth->createOperation('managePost','admininister publications');
/**We have created a role
'reader
'.
* Reader can view the list of posts or view a single post.
*/[...]
$reader->addChild('viewPost');
/**We are going to create a role 'author
'.
* Author can be a reader.
* Author can also create a post
* Author will get a task
'updateOwnPost
'.
* Through th
eis task, author can only update his/her own post.
* For this purpose, we have assinged a rule for it.
*/[...]
$author->addChild('reader');
/**We have created another role 'editor
'.
* Editor is a reader.
* He can edit any post.[...]
$editor->addChild('reader');
// 'ChiefEditor
' has got all the rights.
$chiefEditor=$auth->createRole('chiefEditor');
$chiefEditor->addChild('reader');[...]
6. Selectively assign roles to the user.
---------------------------------------
Now we are going to fetch all the roles of
or current user
is having from the database
.
and going to assign the roles selectively.[...]
{
/*We are not going to assign all the roles.
*Only roles pertinent to this controller are assigened.
*/
if($auth->getAuthItem($role)!==null)[...]
}
//Now call this method inside PostController::init()
public function init()
{[...]
public function accessRules()
{
/**We have some business rules related to updating a paricular post.
* To put th
eat paricular post inside the params, we need
to know the pk value of that post
prior hand.
* We can do the following to achieve that.
*/[...]
/**We assign only the basic operations for each rule here.
* CPhpAuthManager::checkAccess() method will take care of parents(task,role)
* Also look into code of CAccessRule::isRoleMatched
() method.
*/[...]
$auth->createOperation('updateAccount','update an account');
$auth->createOperation('deleteAccount','delete an user account');
$auth->createOperation('manageAccount','admininister user accounts');
/**Default role
'anonymous
' is created.
* We are attaching a bizRule so that guests only can assume anonymous role.
* They can only create an account.[...]
$anonymous->addChild('register');
/**Default role 'authenticated
' is created.
* This has a child
'userAccount
' (task).
* The task ensures that user can view or update only his or her account.
*/[...]
$authenticated->addChild('userAccount');
/** 'userManger
' role is declared in database.
* He has all the rights regarding user accounts.
*/[...]
$params['user']=$this->loadModel($id);
/* *The parent task 'userAccount
' has bizRule with it.
*So we have to pass params with updateAccount and ViewAccount.
*/
return array(
array('allow',
'actions'=>array('index'),[...]