سلام
من میخوام فقط کاربر admin مجوز حذف داشته باشه کد زیر رو که اجرا میکنم فقط برای حذف موقع تایید حذف میگه دسترسی نداره
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['create', 'update', 'delete','view','index'],
'rules' => [
[
'actions' => ['view','index'],
'allow' => true,
'roles' => ['?'],
],
[
'actions' => [ 'create','update','view','index'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['create', 'update', 'delete','view','index'],
'allow' => true,
'roles' => ['admin'],
//'verbs' => ['POST'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
//'roles' => ['admin'],
],
],
];
}
ممنون میشم اگر منو راهنمایی کنید
منظورتون رو از «موقع تأیید حذف» میشه توضیح بدین؟ خود لینک حذف و کادری که برای حذف باز میشه با Javascript هست و رفتاری که الآن توی سؤالتون گفتین، کاملاً منطقیه. مگه اینکه شما چیز دیگری مدنظر داشته باشین.
مشکل اینجاست که عمل حذف توسط admin اتفاق نمیفته وخطا میده
مشکل کد بالا کجاست که این امر طبیعیه ؟
مگرنه اینکه بهش گفتیم فقط ادمین بتونه حذف کنه ؟
باید لینک بصورت Post باشه. بخش Verbs رو حذف کنید تا بتونید با Get کار کنید.
متاسفانه درست نشد
ببینید درست عمل کردم
درفایل configweb کد زیر را گذاشتم
'authManager' => [
'class' => 'yiirbacDbManager',
],
ودر دیتابیسی که با migration خودش ایجاد کردم
admins را در auth_items
و admin را در auth_assignment
ودر auth_item_child هم auth_name=admins , user_id=admin
گذاشتم
درrule هم delete= data رو گذاشتم
یک سوال برای نام role باید از نامی که در item_rule هست استفاده کنیم یا item_name در auth_item ؟
البته من هردو را امتحان کردم نشد
ظاهرا مشکل از نحوه پیکربندی RBAC هستش. برای اینکار بعد از اینکه جداول RBAC تو سط migration ایجاد شد موارد زیر رو انجام بدید:
۱- در جدول auth_item رکورد جدید وارد کنید که مقدار ستون name برابر admin و مقدار ستون type برابر 1 باشد.
۲- با فرض اینکه شما میخواهید به کاربر شماره 1 دسترسی ادمین بدهید در جدول auth_assignment رکورد جدید وارد کنید که مقدار ستون item_name آن برابر admin و مقدار ستون user_id آن برابر 1 باشد.
۳- حالا در کلاس کنترل میتوانید به action مورد نظر role ادمین رو بصورت زیر بدید:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['create', 'update', 'delete', 'view', 'index'],
'rules' => [
[
'actions' => ['view', 'index'],
'allow' => true,
'roles' => ['?'],
],
[
'actions' => ['create', 'update', 'view', 'index'],
'allow' => true,
'roles' => ['@'],
],
[
'actions' => ['delete'],
'allow' => true,
'roles' => ['admin'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}
ممنون
من هم دقیقا همین کارارو کردم اما نشد
جدول auth_rule جنبه اطلاعاتی داره ؟ نقشی در برنامه نداره ؟
جدول auth_rule جنبه اطلاعاتی نداره برای مواردی که مثلا میخواهید هر کاربر post هایی رو که خودش ایجاد کرده رو بتونه ویرایش کنه کاربرد داره.
مثال های مختلف از RBAC در این لینک توضیح داده شده.
http://www.yiiframework.com/doc-2.0/guid...ation.html
برای اینکه مشکل مشخص بشه ببینید خروجی کد زیر چی هستش؟
Yii::$app->user->can('admin');
اگه RBAC درست باشه باید مقدار خروجی true باشه.
ممنون از شما حل شد
اصلا مشکل نه از behavior بود نه از rbac
مشکل از login بود چون user_id نوع استرینگ بود من فکرکرده بودم باید با username یکی باشه در حالیکه باید use_id=100 در جدول auth_assiagnment میذاشتم که درست شد
(لازم به ذکر است از مدل پیش فرض خود yii2 یعنی user.php استفاده کردم که در آنجا برای admin مقداز id=100 است)