View Full Version : اعتبارسنجی با پکیج zizaco/entrust
rahahost
یک شنبه 26 مهر 1394, 02:38 صبح
با سلام و احترام خدمت همه ی دوستان و اساتید محترم .
یه موردی چند روزه که منو درگیر کرده اونم استفاده از پکیج زیر هست :
https://github.com/Zizaco/entrust
این پکیج رو نصب کردم و مشکلی در نصب وجود نداره اما یه مشکل جدی وجود داره اونم اینکه ، شرطی که برای اعتبارسنجی میزارم رو بصورت دو یا چند شرطی قبول نمیکنه ، مثلا :
میخوام بگم :
دسترسی یک متد از کنترلر برای نقش مدیر و کارمندی که مسئول بخش اخبار هست ، باز باشه و در غیر اینصورت به یک پیغام نمایش بده !
کدی که برای بخش نوشتم :
if(Entrust::can('tender_manager') == false OR Entrust::hasRole('admin') == false )
{
return 'test';
}
اگه من هرکدوم از این دو شرط رو بصورت تکی بنویسم ، درست جواب میده اما نمیدونم چرا برای حال OR با این مشکل مواجه میشم !
بخاطر اینکه نمیشه تکی نوشته بشه ، نمیدونم باید چیکارش کنم !
ممنون میشم راهنماییم کنید .
djtrex
یک شنبه 26 مهر 1394, 11:05 صبح
با سلام و احترام خدمت همه ی دوستان و اساتید محترم .
یه موردی چند روزه که منو درگیر کرده اونم استفاده از پکیج زیر هست :
https://github.com/Zizaco/entrust
این پکیج رو نصب کردم و مشکلی در نصب وجود نداره اما یه مشکل جدی وجود داره اونم اینکه ، شرطی که برای اعتبارسنجی میزارم رو بصورت دو یا چند شرطی قبول نمیکنه ، مثلا :
میخوام بگم :
دسترسی یک متد از کنترلر برای نقش مدیر و کارمندی که مسئول بخش اخبار هست ، باز باشه و در غیر اینصورت به یک پیغام نمایش بده !
کدی که برای بخش نوشتم :
if(Entrust::can('tender_manager') == false OR Entrust::hasRole('admin') == false )
{
return 'test';
}
اگه من هرکدوم از این دو شرط رو بصورت تکی بنویسم ، درست جواب میده اما نمیدونم چرا برای حال OR با این مشکل مواجه میشم !
بخاطر اینکه نمیشه تکی نوشته بشه ، نمیدونم باید چیکارش کنم !
ممنون میشم راهنماییم کنید .
کد شما از نظر منطقی مشکل داره و اون هم به نظرم به خاطر پیچیده نوشته شدن اون هست. این سناریو رو در نظر بگیرید:
کاربر مسئول بخش اخبار هست و مشخصه نقش مدیر رو هم نداره در نتیجه عبارت
Entrust::can('tender_manager')
(برام سوال هست شما دارید نقش رو بررسی می کنید چرا به جای hasRole از can استفاده کرده اید؟ can برای انجام یه کار هست مثلا manage-news یا create-article یا accept-comment و ... )
برابر true خواهد شد و قسمت اول OR یا || نادرست خواهد شد در نتیجه عبارت بعد از OR یا || بررسی می شود. چون مسئول بخش اخبار مدیر نیست در نتیجه قسمت دوم برابر با true خواهد بود و وارد if می شویم!
--------------------------
این حالتی هست که کد شما قراره کار کنه و کاربر اخبار رو مدیریت کنه:
اگر مدیر یا مسئول بخش اخبار بود:
if(Entrust::can('tender_manager') || Entrust::hasRole('admin')) {
// Manage the news!
}
برعکس این عبارت با توجه به قانون دمورگان میشه این:
if(!Entrust::can('tender_manager') && !Entrust::hasRole('admin')) {
// You cannot manage the news!
}
--------------------
در ضمن اگه از لاراول ۵.۱.۱۱ به بالا استفاده می کنید می تونید از Gate لاراول برای اینکار استفاده کنید (بدون نیاز به نصب پکیج خاص!)
http://laravel.com/docs/5.1/authorization
rahahost
یک شنبه 26 مهر 1394, 14:39 عصر
ممنون از توضیحات کاملتون :)
این کدی که شما دادین رو تست کردم و الان درست جواب داده اما مشکل اینجاست که من اینو هم تست کرده بودم !
یعنی شرط رو به چند روش نوشته بودم ولی درست در نمیومد و همیشه یه جایه کار خراب میشد ولی ظاهرا یه اشتباهه کوچیک داشتم که با راهنمایی شما حل شد :)
(برام سوال هست شما دارید نقش رو بررسی می کنید چرا به جای hasRole از can استفاده کرده اید؟ can برای انجام یه کار هست مثلا manage-news یا create-article یا accept-comment و ... )
من از hasRole استفاده کردم ، متوجه سوالتون نشدم :-؟
من برای نقش Admin از hasRole استفاده کردم و برای دسترسی از can استفاده کردم ( طبق مستندات خودش ).
تو لاراول 5.1 اعتبارسنجی اینجوری هم اضافه شده ؟
خیلی هم عالی ولی من از 4.2 استفاده میکنم فعلا چون 5.1 خیلی تغییر کرده ، هنوز نتونستم کامل مستندات رو بخونم :)
بازم ممنون از راهنماییه مفیدتون :)
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.