permission user

[font="Tahoma"][right]سلام ، ممنون میشم در مورد سطح دسترسی کاربران توضیحاتی بدید

یادمه که جناب علی برجیان یک سری صحبتها در ایم مورد کرده بود ، ممنون میشم دوستان توضیحاتی همراه با مثال قرار بدن که مثلاً ما چند مدل سطح دسترسی تعریف میکنیم و برای هر کاربر بسته به نوع سطح دسترسی اطلاعاتی رو نمایش میدیم

مثلاً حالا شما سطح دسترسی در این سیستم شبکه اجتماعی رو در نظر بگیرید[/right][/font]

[font="Tahoma"][right]اساتید عزیز این بخش واقعاً جای بحث و یادگیری داره چون من تا میتونستم جستحو تو فروم و گوگل زدم اما تا الان هیچ نتیجه ای نگرفتم

لطف کنید توصیحاتی بدید و جند نمونه هم مثال بزنید[/right][/font]

[rtl]

[font="Tahoma"]سلام . ببخشید من چند روزی فرصت نکردم پاسخ بدم. [/font]

متد accessRules در کنترلر وظیفه دارد که حدود دسترسی را برای انواع کاربران مشخص کند روشهای کنترل دسترسی بسیار متنوع و جالب هستند.

[size="4"]این متد فیلترهای دسترسی کاربر به اکشن های کنترلر را مشخص می کند. به عنوان مثال مشخص می کند که کدام کاربر مجاز به اجرای کدام اکشن می باشد یا نمی باشد.[/size]

[size="4"]برای این که هر کاربری نتواند با وارد کردن هر آدرسی وارد آن صفحه شود از این قسمت استفاده می شود. مثلا کاربری که وارد سایت نشده یعنی [/size]login[size="4"] نکرده نمی تواند کنترلر [/size]Post[size="4"] را اجرا کند.[/size]

[right][left][size="4"]برای هر یک یا چند اکشن می توان یک آرایه جدا تشکیل داد و نحوه دسترسی کاربرانی که می توانند از آن استفاده کنند را مشخص کرد.[/size][/left][/right]

[left][size="4"]از کاراکتر * برای معرفی کردن همه کاربران و از کاراکتر [/size]@ برای معرفی کاربرانی که وارد سایت شده اند استفاده می کنیم همچنین از علامی ؟ برای کاربران ناشناس استفاده می شود. هر مدخل آرایه برای این متد به شکل زیر تعریف می شود :[/left]

[right][left] [/left][/right]

[/rtl]




array('deny or allow',   'actions'=>array('action1','action2',…),   


   	'users'=>array('@ or *')


  ),


  

[right][left][size="4"]ابزار [/size]gii[size="4"] در استفاده از ابزار [/size]Crud generator[size="4"] باعث می شود که مدخلی با شکل زیر ایجاد می کند که برای اجرای اکشن های کاربر باید آن را اصلاح نمود وگرنه اکشن های کاربر اجرا نخواهند شد.[/size][/left][/right]




  array('deny',  // deny all users


   	'users'=>array('*'),


  ),


  

[rtl]

[size="4"]در این اکشن همچنین می توان پارامترهای دیگری مثل [/size]Ip, Roles, Controllers, Verbs, Expression[size="4"] و غیره را نیز استفاده کرد به عنوان مثال از [/size]Ips[size="4"] می توان استفاده کرد تا کاربرانی با [/size]Ip[size="4"] مشخص اجازه استفاده از سایت را داشته باشند یا نداشته باشند. برای مدیریت گروهها نیز از [/size]Roles[size="4"] استفاده می شود که برای توضیحات بیشتر به ویکی پدیا بخش [/size]RBAC[size="4"] مراجعه نمایید.[/size]

روش دیگر این کار تعریف یک شرط است مثل:

[/rtl]





  


array('allow', 


        	'actions'=>array('admin'),


        	'expression'=> 'Yii::app()->user->group == 3',




[font="Tahoma"][right]سلام مرسی جناب برجیان متوجه میشم در مورد توضیحاتی که دادید اما متاسفانه نمیتونم ازش استفاده کنم

اگر میشه لطف کنید اول از همه بگید این ماژول رو چجوری نصب کنیم و بعد اینکه چجوری ازش استفاده کنیم و یک مثال کوچیک رو به عنوان یک پروژه باهاش انجام بدید

چون واقعاً خیلی خیلی جستجو کردم اما به نتیجه ای نرسیدم[/right][/font]

[font="Tahoma"][rtl]

خوب اگه علاقه مند به استفاده از RBAC هستید می تونید از اینجا توضیحات کاملش رو دنبال کنید که همه موارد رو با دقت توضیح داده.

این روش مسلما بسیار کامل و امن هستش

اما من توی پروژه هام از این روش استفاده نمی کنم بلکه گروههای کاربری رو جداگانه تعریف می کنم و با یک شرط ساده در AccessRule اونا رو مدیریت می کنم.

یک مثال ساده :

[/rtl]




	public function accessRules()

	{

	$staff = Staff::model()->findByPk(Yii::app()->user->id);

	$p = $staff->permission;

   

    	return array(

        	array('allow', 

            	'actions'=>array('view','index'),

            	'expression'=> $p->staff.' > 1',

        	),

        	array('allow',

            	'actions'=>array('create','update'),

            	'expression'=> $p->staff.' > 2',

        	),

        	array('allow',

            	'actions'=>array('delete'),

            	'expression'=> $p->staff.' > 3',

        	),

        	array('deny', 

            	'users'=>array('*'),

        	),

    	);

	}



[rtl]

در این مثال ابتدا یک کاربر جاری رو که id اون به شکل Yii::app()->user->id قابل دسترسیه از جدول/مدل Staff فراخوانی کرده ایم

در کد بعدی یعنی $p = $staff->permission; متغیر $p فیلد permission این کاربر رو از جدول فراخوانی میکنه و در $p قرار می ده

کد ‘actions’=>array(‘view’,‘index’), مشخص می کنه که می خوایم اکشن های index و view رو مشخص کنیم

و در ادامه کد ‘expression’=> $p->staff.’ > 1’, مشخص می کنه که اگر مجوز این کاربر $p عددی بزرگتر از 1 باشه این کار انجام بشه

خوب این یک مثال بسیار ساده است

ما می تونیم برای شبکه های اجتماعی که مورد نظر شماست برای هر قسمت یک فیلد جداگانه مثل permission1 - permiassion2 - … تعیین کنیم

و در هر کنترلی که لازمه بررسی کنیم آیا این کاربر مجوز استفاده از این قسمت رو داره یا نه

[/rtl] [/font]

[rtl][font="Tahoma"][right]خوب جناب برجیان معمولاً اینکه بخوایم واسه هر قسمت یک فیلد تو دیتابیس داشته باشیم کار درستی نیست

شما مثلاً سطح دسترسی کاربران فیسبوک را در نظر بگیرید اگر میخواست همچین کاری انجام بده الان منفجر میشد .

من این کد شما رو با کمک خود شما تست کردم و جواب داد و امروز خیلی چیزا در از شما یاد گرفتم ، ممنون

اگر ایده ای برای این قسمت دارید منمون میشم راهنمایی کنید و یا اینکه با ماژول های RBAM یا Rights میشه این اهداف رو بهتر از accessRule خود yii انجام داد ؟[/right][/font][/rtl]

[rtl][font="Tahoma"][right]جناب برجیان من میخوام سطح دسترسی کاربران رو ریز کار کنم یعنی بتونم به هر صفحه یا هر چیزی دسترسی بدم یا ندم

مثلاً کاربر Saman بتونه مطلب بلاگشو رو برای دوستانش فقط باز بزاره و یا فقط برای کسانی که خودش انتخاب میکنه باز بزاره

شما همین accessRule خود Yii رو پیشنهاد میکنید !؟[/right][/font][/rtl]

[font="Tahoma"][rtl]

البته که نمی شه برای هر چیز کوچیکی یک سطح دسترسی تعریف کرد من هم چنین منظوری نداشتم.اگه سوال شما فیس بوک باشه مسئله به این شکل قابل حله :

در جدول permission گروههای مطالب مشخص می شه و برای هر کاربر یک عدد به عنوان مجوز در نظر گرفته می شه. مثال

[/rtl]

Permission Table


userId[/font][font="Tahoma"]------[/font][font="Tahoma"]Profile[/font][font="Tahoma"]----------[/font][font="Tahoma"]Setting[/font][font="Tahoma"]---------------[/font][font="Tahoma"]Wall----------------Groups----------Causes[/font][font="Tahoma"]------------[/font][font="Tahoma"]Applications

1---------------2[/font][font="Tahoma"]------------------[/font][font="Tahoma"]1---------------------3-----------------------1-------------------0---------------------2

2[/font][font="Tahoma"]---------------[/font][font="Tahoma"]3[/font][font="Tahoma"]------------------[/font][font="Tahoma"]3[/font][font="Tahoma"]---------------------[/font][font="Tahoma"]2[/font][font="Tahoma"]-----------------------[/font][font="Tahoma"]0[/font][font="Tahoma"]-------------------[/font][font="Tahoma"]1[/font][font="Tahoma"]---------------------[/font][font="Tahoma"]2

[rtl]

و شرایط رو اینجوری تعریف می کنیم

[/rtl]

0= deny

1 = view

2=edit/create

3=delete/admin

[rtl]

حالا می بینیم که مثلا کاربر 1 حق دسترسی و مشاهده Causes رو نداره ولی روی wall خودش حق دسترسی نامحدود یعنی 3 است

و به همین ترتیب برای بقیه

در مورد پیامهای سیستم و یا پست ها سطح دسترسی روی خود همون رکورد ذخیره می شه مثلا

[/rtl]

Post Table


id----------title------------------content---------------------status

1----------Hello---------------Hello World-----------------------1

2----------Welcome---------Welcome User-------------------2

[rtl]

که status به شکل زیر تعریف می شه

[/rtl]

Status :

0 = Inactive

1= Just Owner

2 = Just Friends

3 = Public Show

[rtl]

این مقادیر طبیعتا طبق نظر برنامه نویس مشخص می شوند.

اما اگر بخوایم حالت داینامیک کار رو بیشتر کرده باشیم می تونیم جدول permission رو به شکل زیر تعریف کنیم

[/rtl]

Permission Table


id----------userId-----------Permission------Value

1------------1--------------- Application -----3

2[/font][font="Tahoma"]------------1[/font][font="Tahoma"]--------------- [/font][font="Tahoma"]Wall[/font][font="Tahoma"]----------------[/font][font="Tahoma"]1

3[/font][font="Tahoma"]------------1[/font][font="Tahoma"]--------------- [/font][font="Tahoma"]Causes------------2

4[/font][font="Tahoma"]------------2[/font][font="Tahoma"]--------------- [/font][font="Tahoma"]Wall----------------2

5[/font][font="Tahoma"]------------2[/font][font="Tahoma"]--------------- [/font][font="Tahoma"]Groups------------0

[rtl]

مزیت این روش اینه که جدول 1-چند permission اجازه می ده در آینده هر Permission جدیدی اضافه شد بدون تغییر ساختار جداول اونو اضافه کنیم.

[/rtl]

[/font]

[right][font="Tahoma"]بسیار بسیار ممنون خیلی لطف کردید[/font][/right]

salam

zamani ke ma haghe dastresi ijad mikonim agar karbar varede site nashode bashe ona mifreste be site/login

hala age bekhaym ona redirect kone be admin/login bayad che kar anjam bedim?

[RTL]به نظر بنده بهترین راه استفاده از RBAC هست که هر مجوزی که بخواین رو میتونین به صورت کاملا داینامیک تولید کنین و ازش استفاده کنین[/RTL]

salam aghaye jaberiyan

man ghesmate RBaC ra khundam vali tozihat darbare auth.php vanahve ijadesho nafahmidam, yan nemitavan be tore mamul ba eclips ye file php tu folder data ijad kard va code gofteshe shode ra unja nevesht?

man kolan nemidunam chetor bayadin file auth.php ra ijad kard?