PDA

View Full Version : اعتبارسنجی با پکیج zizaco/entrust



rahahost
یک شنبه 26 مهر 1394, 01:38 صبح
با سلام و احترام خدمت همه ی دوستان و اساتید محترم .

یه موردی چند روزه که منو درگیر کرده اونم استفاده از پکیج زیر هست :
https://github.com/Zizaco/entrust


این پکیج رو نصب کردم و مشکلی در نصب وجود نداره اما یه مشکل جدی وجود داره اونم اینکه ، شرطی که برای اعتبارسنجی میزارم رو بصورت دو یا چند شرطی قبول نمیکنه ، مثلا :

میخوام بگم :
دسترسی یک متد از کنترلر برای نقش مدیر و کارمندی که مسئول بخش اخبار هست ، باز باشه و در غیر اینصورت به یک پیغام نمایش بده !

کدی که برای بخش نوشتم :




if(Entrust::can('tender_manager') == false OR Entrust::hasRole('admin') == false )
{
return 'test';
}



اگه من هرکدوم از این دو شرط رو بصورت تکی بنویسم ، درست جواب میده اما نمیدونم چرا برای حال OR با این مشکل مواجه میشم !
بخاطر اینکه نمیشه تکی نوشته بشه ، نمیدونم باید چیکارش کنم !


ممنون میشم راهنماییم کنید .

djtrex
یک شنبه 26 مهر 1394, 10: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, 13:39 عصر
ممنون از توضیحات کاملتون :)

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

یعنی شرط رو به چند روش نوشته بودم ولی درست در نمیومد و همیشه یه جایه کار خراب میشد ولی ظاهرا یه اشتباهه کوچیک داشتم که با راهنمایی شما حل شد :)




(برام سوال هست شما دارید نقش رو بررسی می کنید چرا به جای hasRole از can استفاده کرده اید؟ can برای انجام یه کار هست مثلا manage-news یا create-article یا accept-comment و ... )


من از hasRole استفاده کردم ، متوجه سوالتون نشدم :-؟
من برای نقش Admin از hasRole استفاده کردم و برای دسترسی از can استفاده کردم ( طبق مستندات خودش ).


تو لاراول 5.1 اعتبارسنجی اینجوری هم اضافه شده ؟
خیلی هم عالی ولی من از 4.2 استفاده میکنم فعلا چون 5.1 خیلی تغییر کرده ، هنوز نتونستم کامل مستندات رو بخونم :)

بازم ممنون از راهنماییه مفیدتون :)