PDA

View Full Version : چند تا سوال در مورد تابع accessRules داشتم



mostafa_shoakry
جمعه 05 اردیبهشت 1393, 01:06 صبح
1. اگه من بخوام که هیچ کاربری به غیر از اونی که لاگین کرده ( مثلا یک کاربری که می تونه تو پنل مدیریت سایت تغییرات انجام بده ) به صفحات و توابع موجود در پنل مدیریت دسترسی پیدا نکنه کدومو تغییر بدم؟
تابع من به این شکل هست :


public function accessRules() {

return array(
array('allow', //
'actions' => array(), ///<--------
'users' => array('*'),
),
array('allow', // allow authenticated user
'actions' => array('index', 'insert', 'update', 'view'),
'users' => array('@'),
),
array('allow', // allow admin user
'actions' => array('admin', 'delete'),
'users' => array('admin'),
),
array('deny', // deny all users
'users' => array('*'),
),
);

}

یعنی هر بار میام تو قسمتی که نشون دادم توابع رو می نویسم مثل :view,insert , update و ...

2. سوال دومم اینکه این از کجا میدونه کاربری که لاگین کرده admin هست و سطح دسترسی رو اعمال می کنه.( همونجایی که بعضی از اکشن هارو برای admin نوشتیم )
منظورم اینه که آیا حتما باید نام کاربریمون تو دیتابیس باید admin باشه تا تابع بفهمه کاربر Admin هست؟

3. چطوری می تونیم سطح دسترسی داینامیک بدیم با استفاده از RBAC ؟
تو یکی از پروژه هام باید چندتا کاربر تعریف کنیم به صورت داینامیک که کاربر تعریف شده فقط مثلا به اکشن view دسترسی داشته و نه به delete و یا update

MMSHFE
جمعه 05 اردیبهشت 1393, 08:31 صبح
1- منظورتون رو دقیق تر بگین. مدیریت رو بصورت ماژول درست کردین؟
2- از روی فیلد name در CWebUser که در UserIdentity مشخص میشه، تشخیص میده.
3- درمورد استفاده از RBAC توی پکیج توضیح دادم ولی توی افزونه های Yii موارد بهتری هم هست. البته میتونید بطور دستی هم انجام بدین که اول باید جواب مورد 1 رو بدین تا برحسب نیازتون و نوع استفاده شما توی پروژه، راهنمایی کنم.

mostafa_shoakry
جمعه 05 اردیبهشت 1393, 09:19 صبح
1- منظورتون رو دقیق تر بگین. مدیریت رو بصورت ماژول درست کردین؟

بله دقیقا یک ماژول ادمین اضافه کردم

MMSHFE
جمعه 05 اردیبهشت 1393, 10:31 صبح
خوب در این صورت، کارتون خیلی راحت تره. میتونید دسترسی به تمام اکشنها رو برای کاربران لاگین کرده باز بگذارین:

public function accessRules()
{
return array(
array(
'allow',
'users'=>array('@'),
),
array(
'deny',
'users'=>array('*'),
),
);
}
و بعد، توی فایل AdminModule.php که برای شما توی پوشه ماژول ساخته شده، این کد رو بنویسید:

<?php

class AdminModule extends CWebModule
{
public function init()
{
// this method is called when the module is being created
// you may place code here to customize the module or the application

// import the module-level models and components
$this->setImport(array(
'mngr.models.*',
'mngr.components.*',
));
}

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
if(Yii::app()->user->isGuest || !in_array(Yii::app()->user->id, array(1, 3, 5)) {
throw new CHttpException(403, 'دسترسی غیر مجاز');
}
return true;
}
else
return false;
}
}
الان توی کد فوق، اگه id کاربر 1 یا 3 یا 5 نباشه، خطای 403 براش صادر میشه و میگه دسترسی غیرمجاز
اگه یکم روی این سیستم فکر کنید، به راحتی میتونید ساختار دستی خودتون رو برای RBAC بخش مدیریت ازطریق دیتابیس، ایجاد کنید و فرضاً رکورد متناظر با id کاربر جاری رو از جدول access در دیتابیس پیدا کنید. اگه اصلاً رکوردی نبود که یعنی کاربر مدیر نیست و اگه بود، فرضاً فیلد accessController و accessAction رو چک کنید و به ترتیب با this->id$ و this->action->id$ مقایسه کنید و اگه برابر بود یا رکورد مربوطه پیدا شد، اجازه بدین کار کنه وگرنه خطای 403 تولید کنید.

armanb2013
شنبه 06 اردیبهشت 1393, 23:46 عصر
بنده هم یک سوال در این زمینه برام پیش اومده ، که گفتم تاپیک جدید نزنم و همینجا بپرسم :لبخندساده:
اگر فرض کنیم یک پروژه ساده داشته باشیم که با accessRule ها کارمون راه بیفته . (یوزر ها هم تو db هستند)
حالا بخواهیم 2 تا و یا تعداد بیشتری user نقش admin رو داشته باشند ، باید چکار کنیم ؟؟

MMSHFE
یک شنبه 07 اردیبهشت 1393, 10:45 صبح
دقیقاً پست قبل از خودتون رو بخونید. فکر میکنم جوابی که میخواین رو گذاشتم.

armanb2013
یک شنبه 07 اردیبهشت 1393, 13:12 عصر
آره درسته من به قضیه یه جور دیگه نگاه کرده بودم !