PDA

View Full Version : سطح دسترسی به پروفایل کاربران



reza.palang
جمعه 15 آبان 1388, 10:37 صبح
با سلام مجدد
سوالی که داشتم در مورد سیستم تعیین هویت هست.
تا اونچا که من آشنا شدم برای آدرس هایی به شکل زیر میشه برای کاربر های مختلف سطح دسترسی تعریف کرد.
/controller
/controller/action
میخوام بدونم برای آدرسهایی به شکل زیر چطور میشه این کار رو کرد
/controller/action/id
مثلا برای اینکه هر کاربر فقط به پروفایل خودش دسترسی داشته باشه و نه دیگر پروفایل ها

cybercoder
چهارشنبه 20 آبان 1388, 13:21 عصر
خوب با Acl فقط به همین کاربر allow بده دیگه فکر کنم حل بشه

reza.palang
چهارشنبه 20 آبان 1388, 13:54 عصر
ممنون برای جواب
چطور این کار باید انچام بشه؟
از یه همچین چیزی باید استفاده بشه؟:
$this->Auth->user

zoghal
پنج شنبه 21 آبان 1388, 08:56 صبح
متاسفانه من هنوز نتونستم منطق به کار گیری acl رو یاد بگیرم و استفاده کنم. وحید جان یک توضیح میدی؟

maysamscript
پنج شنبه 21 آبان 1388, 10:14 صبح
من فکر کنم باید در مدل نوع ACL را controlled قرار داد.

var $actsAs = array('Acl' => array('type' => 'controlled'));من هم خیلی دنبال این موضوع هستم که بتونم برای یک رکورد خاص سطح دسترسی قرار دهم. مثلاً برای یک یوزر میخوام تعیین کنم به چه دسته ای از اخبار بتونه دسترسی داشته باشه و اونو مدیریت کنه. هنوز داکیومنشن کاملی رو در این زمینه پیدا نکردم

cybercoder
پنج شنبه 21 آبان 1388, 14:50 عصر
خوب دوستان شما این لینک رو مطالعه بفرمایید آقای مارک استوری تقریبا خوب توضیح داده:
http://www.mark-story.com/nodes/view/auth-and-acl-an-end-to-end-tutorial-pt-1
اما بیاد داشته باشید که به چند روش مختلف میشه از ACL استفاده کرد.
فقط این توضیح رو بدم که ببینید وقتی شما می خواهید به طور مثال یک "پست خاص" یا یک "مقاله خاص" که خودش عضو مجموعه ای هستش رو به طور مثال:
تقی مجوز رایت کل اون مجموعه رو داره
شما می خواید به حسن مجوز ویرایش یا حذف فقط همون پست رو بدید.
یا هیچ کس نداره فقط حسن داشته باشه ( مثل همون پروفایل )

لازمه که شما در هنگام ایجاد اون رکورد در جدول ACO ها تون یعنی اشیائی که بر اون ها کنترل باید صورت بگیره ( اسمش روشه دیگه ) یه رکورد متناظر بزنید.
بعدا با دستور ACL->Allow می تونید خیلی راحت به حسن اجازه مجوز خاصی رو روش بدید

مثلا این تابع برای ذخیره یک پست یا مقاله رو ببینید:


function add() {
if (!empty($this->data)) {
$this->Post->create();
$current_user=$this->Auth->user() ;
$this->data['Post']['user_id']=$current_user['User']['id'] ;
if ($this->Post->save($this->data)) {
$parent = $this->Acl->Aco->findByAlias('Posts');
$this->Acl->Aco->create(array(
'alias' =>$this->data['Post']['title'].':'.$this->Post->id,
'model' => 'Post',
'foreign_key' => $this->Post->id,
'parent_id' => $parent['Aco']['id']
)
);
$this->Acl->Aco->Save() ;

$this->Session->setFlash(__('The Post has been saved', true));
$this->redirect(array('action'=>'index'));
} else {
$this->Session->setFlash(__('The Post could not be saved. Please, try again.', true));
}
}
}

تو این کد میایم به محض اینکه یک پست اضافه میشه یک رکورد متناظر در جدول ACOS می زنیم
خوب حالا خیلی راحت می تونید با دستور Allow مجوزها رو کنترل کنیم

اگر از Auth و ACL با هم استفاده کنید خیلی از مسائل راحت تر و سریع تر حل میشه هرچند اینها لازم و ملزوم یکدیگر نیستند و هرکدام به تنهایی کار خودش رو میکنه

اگر روشن نشد بگید من یک مقداری کد قبلا در این مورد نوشتم براتون میذارم اگر نه یه مقاله به صورت Tutorial بنویسم
موفق باشید

zoghal
پنج شنبه 21 آبان 1388, 17:50 عصر
من امروز رو کلا روی همین وفت گزاشتمو تا یک چیزایی وایم داره روشن شد. بیشتر گیرم روی تیبل های aro و aco هست. که گروپ ها و یا دسته بندی ها رو چه طور باید انجام بدیم.

cybercoder
پنج شنبه 21 آبان 1388, 23:32 عصر
برای ساده شدن aco ها رو همون شی ها در نظر بگیر aro ها رو هم کاربران و گروه های کاربری که به شی ها دسترسی دارن
شی ها چین؟ می تونه کل کنترلر مقالات باشه یا فقط یک مقاله
حالا اگه یک مقاله باشه parent ش میشه مقالات یا مجموعه ای از مقالات

maysamscript
جمعه 22 آبان 1388, 00:07 صبح
مثلا این تابع برای ذخیره یک پست یا مقاله رو ببینید:
کد:


function add() {
if (!empty($this->data)) {
$this->Post->create();
$current_user=$this->Auth->user() ;
$this->data['Post']['user_id']=$current_user['User']['id'] ;
if ($this->Post->save($this->data)) {
$parent = $this->Acl->Aco->findByAlias('Posts');
$this->Acl->Aco->create(array(
'alias' =>$this->data['Post']['title'].':'.$this->Post->id,
'model' => 'Post',
'foreign_key' => $this->Post->id,
'parent_id' => $parent['Aco']['id']
)
);
$this->Acl->Aco->Save() ;

$this->Session->setFlash(__('The Post has been saved', true));
$this->redirect(array('action'=>'index'));
} else {
$this->Session->setFlash(__('The Post could not be saved. Please, try again.', true));
}
}
}
تو این کد میایم به محض اینکه یک پست اضافه میشه یک رکورد متناظر در جدول ACOS می زنیماین کار رو میشه به طور اتوماتیک توی مدل با تنظیم تابع parentNode انجام داد. فقط قبلش باید کد زیر رو هم در مدل قرار داد.

var $actsAs = array('Acl'=> array('type' => 'controlled'));

cybercoder
جمعه 22 آبان 1388, 11:52 صبح
این کار رو میشه به طور اتوماتیک توی مدل با تنظیم تابع parentNode انجام داد. فقط قبلش باید کد زیر رو هم در مدل قرار داد.

بله با فراخوانی تابع Aftersave و override کردنش راحت تره منتها من یکجا گذاشتم تا دوستانی که تازه دارند یاد می گیرند confuse نشن. در مورد actas هم می تونه به صورت controlled یا requester باشه که بستگی به شما داره که چطور از acl استفاده می کنید
این کد رو که من موقع ثبت نام کاربر در یکی از سایت ها استفاده کردم ببینید: ( در مدل )


var $actsAs=array('Acl'=>'requester') ;
var $belongsTo=array('Group') ;

function afterSave($created) {
if ($created) {
$id=$this->getLastInsertID() ;
$aro=new Aro() ;
$aro->updateAll(array('alias'=>'\'User:'.$id.'\''),
array('Aro.model'=>'User',
'Aro.foreign_key'=>$id)
);
}
else {
$data=$this->read() ;
$parent_id=$data['User']['group_id'] ;

$aro=new Aro() ;

$aro_record=$aro->findByAlias('Group:'.$parent_id) ;
$parent_record=$aro->findByAlias('Group:'.$parent_id) ;

if (!empty($aro_record)) {
$parent_id='0' ;
if (!empty($parent_record)) {
$parent_id=$parent_record['Aro']['id'] ;
}


$aro->save(array(
'parent_id'=>$parent_id,
'id'=>$aro_record['Aro']['id']
)) ;
}
}
return true ;
}

function parentNode() {
$data=$this->read() ;
return 'Group:'.$data['User']['group_id'] ;
}

موفق باشید