زمان جاری: 2012/05/24, 03:56 PM خوش آمدید مهمان گرامی! (ورودعضویت)



آموزش استفاده از کامپوننت ACL


ارسال موضوع  ارسال پاسخ 
  • 2 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
رتبه موضوع:
 
آموزش استفاده از کامپوننت ACL
نویسنده پیام
meysam آفلاین
WebSaman
*

ارسال‌ها: 7
تاریخ عضویت: Jan 2010
رتبه: 0
تشکر: 1
23 بار تشکر شده در 6 پست
ارسال: #1
آموزش استفاده از کامپوننت ACL
با سلام
بنا به درخواست دوستان و نیز اهمیت کامپوننت ACL قصد دارم در این تاپیک نحوه استفاده از آن را در حد وسعم شرح دهم.

قسمت اول
ACL و یا Access Control List برای مدیریت کنترل دسترسی در پروژه استفاده میشود. ACL از دو بخش درخواست کننده(ARO) و درخواست شونده (ACO) تشکیل می شود.

ARO و ACO
ARO ها همان کاربران و یا گروه های کاربری هستند که قرار است مجوز دسترسی به ACO ها را دریافت کنند و یا دسترسی آنها به ACO ها محدود شود.
ACO ها را شما انتخاب میکنید که چه چیزی باشند. درصورتی که کامپوننت ACL را به همراه کامپوننت Auth استفاده میکنید باید تمام کنترلر ها و اکشن های پروژه را به لیست ACO ها اضافه کنید.
ضمناً کامپوننت ACL باید قبل از کامپوننت Auth در کنترلر فراخوانی شود.

کد PHP:
var $components = array('Acl','Auth'); 

قبل از هر چیز لازم است جداول ذخیره سازی ACO ها و ARO ها را در دیتابیس ایجاد کنید.

کد:
--
-- Table structure for table `acos`
--

CREATE TABLE `acos` (
  `id` int(10) NOT NULL auto_increment,
  `parent_id` int(10) default NULL,
  `model` varchar(255) default NULL,
  `foreign_key` int(10) default NULL,
  `alias` varchar(255) default NULL,
  `lft` int(10) default NULL,
  `rght` int(10) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=114 ;

-- --------------------------------------------------------

--
-- Table structure for table `aros`
--

CREATE TABLE `aros` (
  `id` int(10) NOT NULL auto_increment,
  `parent_id` int(10) default NULL,
  `model` varchar(255) default NULL,
  `foreign_key` int(10) default NULL,
  `alias` varchar(255) default NULL,
  `lft` int(10) default NULL,
  `rght` int(10) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

-- --------------------------------------------------------

--
-- Table structure for table `aros_acos`
--

CREATE TABLE `aros_acos` (
  `id` int(10) NOT NULL auto_increment,
  `aro_id` int(10) NOT NULL,
  `aco_id` int(10) NOT NULL,
  `_create` varchar(2) NOT NULL default '0',
  `_read` varchar(2) NOT NULL default '0',
  `_update` varchar(2) NOT NULL default '0',
  `_delete` varchar(2) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `ARO_ACO_KEY` (`aro_id`,`aco_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

برای ایجاد خودکار ACO ها از روی پروژه میتوانید از کد موجود در این صفحه استفاده کنید.

خوب در ادامه یک مثال از ACL ارائه خواهد شد.

در به در كوچه تنهاييم
2010/05/28 02:25 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : saleh chalist mohsened payamsp
chalist آفلاین
تازه کار
*

ارسال‌ها: 48
تاریخ عضویت: Jan 2010
رتبه: 0
تشکر: 51
14 بار تشکر شده در 15 پست
ارسال: #2
RE: آموزش استفاده از کامپوننت ACL
منتظر بخش بعدی هستیم هاااااااا به شدت
ممنون

ز باغ پیرهنت چون دریچه ها وا شد - بهشت گمشده پشت دریچه پیدا شد
رها ز سلطه ی پاییز، در بهار اتاق - گلی به نام تو در بازوان من وا شد
به دیدن تو همه ذره های من شد چشم - و چشم ها همه سر تا به پا تماشا شد
شتاب خواستنت این چنین که می بالد - به دیدن تو مگر می توان شکیبا شد
پدرغزل معاصر ایران - حسین منزوی
2010/05/30 06:43 AM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
meysam آفلاین
WebSaman
*

ارسال‌ها: 7
تاریخ عضویت: Jan 2010
رتبه: 0
تشکر: 1
23 بار تشکر شده در 6 پست
ارسال: #3
RE: آموزش استفاده از کامپوننت ACL
قسمت دوم

در قسمت قبل ACO و ARO شرح داده شد. امیدوارم مفهوم این دو برای شما روشن شده باشد.

ساخت ARO
دو مدل User و Group را به عنوان ARO در نظر می گیریم. User کاربران سیستم هستند و Group هم گروه های کاربری.
فرض کنید در یک سیستم فروشگاه کاربری به نام ali وجود دارد. علی یک مدیر ارشد است و قادر می باشد تمام امور مربوط به فروشگاه را انجام دهد. احمد در این سیستم تنها می تواند کالاها را اضافه و یا ویرایش کند اما حق حذف کالا را ندارد. در صورتی که کاربران شبیه به علی و احمد زیاد باشند می توانیم با گروه بندی این کاربران ، مجوز های دسترسی را فقط روی گروه تنظیم کنیم. مثلاً در این سیستم می توانیم یک گروه Admin و یک گروه Operator داشته باشیم که به ترتیب علی و احمد عضو آنها هستند. هر کاربری که در گروه Admin قرار بگیرد تمام مجوز های این گروه را خواهد داشت. این فروشگاه کاربر دیگری به نام جواد دارد که او می تواند تمام کارهای یک مدیر ارشد را همچون علی انجام دهد اما او قادر نیست کاربران سیستم را حذف و یا اضافه کند. ما با قرار دادن جواد در گروه Admin تمام مجوز ها را به او می دهیم و با منع کردن دسترسی او به کنترلر users از انجام کلیه امور مربوط به کاربران جلوگیری می کنیم. توجه کنید اگر خواسته باشیم لیست کاربران را به جواد نشان دهیم باید مجوز اکشنی همچون index را به جواد بدهیم.
شاید تاکنون متوجه ساختار درختی ARO و ACO شده باشید. در ادامه بیشتر این موضوع را درک می کنید.

اکنون جداول users و groups را می سازیم:
کد:
--
-- Table structure for table `groups`
--

CREATE TABLE `groups` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(100) character set utf8 collate utf8_persian_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Table structure for table `users`
--

CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(255) character set utf8 collate utf8_persian_ci NOT NULL,
  `password` char(40) NOT NULL,
  `name` varchar(255) character set utf8 collate utf8_persian_ci NOT NULL,
  `lastname` varchar(255) character set utf8 collate utf8_persian_ci NOT NULL,
  `group_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `username` (`username`),
  KEY `group_id` (`group_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Constraints for table `users`
--
ALTER TABLE `users`
  ADD CONSTRAINT `users_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

و همچنین مدلها
کد PHP:
<?php
class User extends AppModel
{
    var 
$name 'User';
    var 
$belongsTo = array(
        
'Group' => array(
            
'className'    => 'Group',
            
'foreignKey'   => 'group_id'
        
)
    );
    var 
$actsAs = array('Acl' => 'requester');

    function 
parentNode() {
        if (!
$this->id && empty($this->data)) {
            return 
null;
        }
        
$data $this->data;
        if (empty(
$this->data)) {
            
$data $this->read();
        }
        if (!
$data['User']['group_id']) {
            return 
null;
        } else {
            return array(
'Group' => array('id' => $data['User']['group_id']));
        }
    }
}
?>
کد PHP:
<?php
class Group extends AppModel {
    var 
$name 'Group';
    var 
$hasMany = array(
        
'User' => array(
            
'className' => 'User',
            
'foreignKey' => 'group_id',
            
'dependent' => false
        
)
    );
    var 
$actsAs = array('Acl' => 'requester');
    
    function 
parentNode() {
        return 
null;
    }
}
?>

به متغییر actsAs و همچنین تابع parentNode در هر دو مدل توجه کنید.
'Acl' => 'requester' نشان می دهد هر دو مدل از نوع ARO هستند.
دقت کنید در کیک یک کامپوننت Acl و یک رفتار(behaviors) Acl وجود دارد که متفاوت، اما به هم مربوطند. وقتی یک مدل دارای رفتار Acl باشد به یک تابع به نام parentNode نیاز دارد. زمانی که یک کاربر و یا یک گروه کاربری اضافه می شود معادل آن نیز باید در جدول aros اضافه شود. درصورت حذف نیز رکورد معادل در جدول aros باید حذف شود. این کار مشکل به نظر می رسد اما اگر تابع parentNode به درستی طراحی شود این عمل به طور خودکار توسط رفتار Acl انجام می شود.
همانطور که قبلاً نیز اشاره شد جداول aros و acos دارای ساختار درخت گونه هستند. در این مثال جدول aros حداکثر عمق 2 را می تواند داشته باشد. Group ها همیشه پدر و User ها همیشه فرزند یک گروه هستند بنابراین parent_id مربوط به Group در جدول aros باید حتماً NULL باشد. اگر به تابع parentNode در مدل Group نگاه بیندازید ، متوجه خواهید شد که چرا همیشه خروجی NULL دارد. پس وظیفه تابع parentNode تولید گره پدر می باشد.
گره پدر برای مدل User همان گره گروه خودش است.

درصورتی که مدل Group نیز ساختار درختی داشته باشد ، عمق مذکور تا بی نهایت می تواند ادامه داشته باشد یعنی گروها می توانند خود فرزند گروه دیگری باشند و تابع parentNode هم باید تغییر کند.

کد PHP:
function parentNode() {
    if (!
$this->id && empty($this->data)) {
        return 
null;
    }
    
$data $this->data;
    if (empty(
$this->data)) {
        
$data $this->read();
    }
    if (!
$data['Group']['parent_id']) {
        return 
null;
    } else {
        return array(
'Group' => array('id' => $data['Group']['parent_id']));
    }

ادامه دارد...

در به در كوچه تنهاييم
(آخرین تغییر در این ارسال: 2010/05/30 09:28 PM توسط meysam.)
2010/05/30 09:27 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : parsig payamsp chalist saleh mohsened horap30 ali_fattahi cybercoder ghasem.fattahpour Alir3z4 nimaboy
meysam آفلاین
WebSaman
*

ارسال‌ها: 7
تاریخ عضویت: Jan 2010
رتبه: 0
تشکر: 1
23 بار تشکر شده در 6 پست
ارسال: #4
RE: آموزش استفاده از کامپوننت ACL
سلام
ببخشید که فرصت نکردم آموژش را ادامه بدم اما یک مقاله خیلی مفید در مورد ACL پیدا کردم که توصیه می کنم مطالعه کنید
آموزش ACL

در به در كوچه تنهاييم
2010/07/31 08:51 PM
یافتن تمامی ارسال‌های این کاربر نقل قول این ارسال در پاسخ
 تشکر شده توسط : chalist saleh امیر payamsp
ارسال موضوع  ارسال پاسخ 


پرش در انجمن: