مجوز
معرفی
لاراول علاوه بر ارائه خدمات احراز هویت خارج از جعبه، راه ساده ای نیز برای مجوز دادن به اقدامات کاربر در برابر یک منبع داده شده ارائه می دهد. مانند احراز هویت، رویکرد لاراول به مجوز ساده است و دو راه اصلی برای مجوز دادن به اقدامات وجود دارد: دروازهها و سیاستها.
به دروازه ها و سیاست هایی مانند مسیرها و کنترلرها فکر کنید. گیتس یک رویکرد ساده و مبتنی بر بسته شدن را برای مجوز ارائه می دهد در حالی که سیاست ها، مانند کنترلرها، منطق خود را حول یک مدل یا منبع خاص گروه بندی می کنند. ابتدا گیت ها را بررسی می کنیم و سپس سیاست ها را بررسی می کنیم.
شما نیازی به انتخاب بین استفاده انحصاری از گیت ها یا استفاده انحصاری از سیاست ها در هنگام ساختن یک برنامه ندارید. اکثر برنامه ها به احتمال زیاد حاوی ترکیبی از گیت ها و سیاست ها هستند، و این کاملاً خوب است! گیت ها برای اقداماتی که به هیچ مدل یا منبعی مرتبط نیستند، مانند مشاهده داشبورد سرپرست، بیشتر کاربرد دارند. در مقابل، زمانی که میخواهید برای یک مدل یا منبع خاص مجوز انجام دهید، باید از خطمشیها استفاده شود.
دروازه ها
گیتس نوشتن
گیت ها بسته هایی هستند که تعیین می کنند آیا کاربر مجاز به انجام یک عمل
خاص است و معمولاً در
App\Providers\AuthServiceProvider
کلاس با استفاده از
Gate
نما تعریف می شوند.
گیت ها همیشه یک نمونه کاربر را به عنوان اولین آرگومان دریافت می کنند و
ممکن است به صورت اختیاری آرگومان های اضافی مانند مدل Eloquent مربوطه را دریافت کنند:
/** * Register any authentication / authorization services. * * @return void */public function boot(){ $this->registerPolicies(); Gate::define('edit-settings', function ($user) { return $user->isAdmin; }); Gate::define('update-post', function ($user, $post) { return $user->id === $post->user_id; });}
Class@method
گیت ها همچنین ممکن است با استفاده از یک رشته استایل برگشتی مانند کنترلرها
تعریف شوند :
/** * Register any authentication / authorization services. * * @return void */public function boot(){ $this->registerPolicies(); Gate::define('update-post', 'App\Policies\PostPolicy@update');}
اعمال مجوز
برای مجاز کردن یک اقدام با استفاده از گیتها، باید از روشهای
allows
یا استفاده کنید
denies
.
توجه داشته باشید که لازم نیست کاربر تأیید شده فعلی را به این روش ها منتقل
کنید.
لاراول به طور خودکار از عبور دادن کاربر به دروازه بسته شدن مراقبت می کند:
if (Gate::allows('edit-settings')) { // The current user can edit settings} if (Gate::allows('update-post', $post)) { // The current user can update the post...} if (Gate::denies('update-post', $post)) { // The current user can't update the post...}
اگر می خواهید تعیین کنید که آیا یک کاربر خاص مجاز به انجام یک عمل است، می
توانید از
forUser
روش روی
Gate
نما استفاده کنید:
if (Gate::forUser($user)->allows('update-post', $post)) { // The user can update the post...} if (Gate::forUser($user)->denies('update-post', $post)) { // The user can't update the post...}
میتوانید همزمان چندین اقدام را با روشهای
any
زیر مجاز کنید
none
:
if (Gate::any(['update-post', 'delete-post'], $post)) { // The user can update or delete the post} if (Gate::none(['update-post', 'delete-post'], $post)) { // The user cannot update or delete the post}
مجوز یا پرتاب استثناها
اگر میخواهید اقدامی را مجاز کنید و
Illuminate\Auth\Access\AuthorizationException
اگر کاربر مجاز به انجام آن عمل نباشد، به طور خودکار یک علامت را پرتاب
کنید، میتوانید از این
Gate::authorize
روش استفاده کنید.
نمونه هایی از
AuthorizationException
به طور خودکار به
403
پاسخ HTTP تبدیل می شوند:
Gate::authorize('update-post', $post); // The action is authorized...
ارائه متن اضافی
متدهای گیت برای مجاز کردن توانایی ها (
،،،،،،،،،،
)
allows
و
دستورالعمل های مجوز
Blade
(
،،،
)
می توانند آرایه ای را به عنوان آرگومان
دوم
دریافت
کنند
.
این عناصر آرایه بهعنوان پارامترهایی به گیت ارسال میشوند و میتوانند
برای زمینه اضافی هنگام تصمیمگیری مجوز استفاده شوند:
denies
check
any
none
authorize
can
cannot
@can
@cannot
@canany
Gate::define('create-post', function ($user, $category, $extraFlag) { return $category->group > 3 && $extraFlag === true;}); if (Gate::check('create-post', [$category, $extraFlag])) { // The user can create the post...}
پاسخ های گیت
تا اینجا ما فقط گیت هایی را بررسی کرده ایم که مقادیر ساده بولی را برمی
گرداند.
با این حال، گاهی اوقات ممکن است بخواهید پاسخ دقیق تری، از جمله یک پیام
خطا، بازگردانید.
برای انجام این کار، می توانید یک عدد
Illuminate\Auth\Access\Response
از دروازه خود برگردانید:
use Illuminate\Auth\Access\Response;use Illuminate\Support\Facades\Gate; Gate::define('edit-settings', function ($user) { return $user->isAdmin ? Response::allow() : Response::deny('You must be a super administrator.');});
هنگام برگرداندن پاسخ مجوز از گیت شما،
Gate::allows
روش همچنان یک مقدار بولی ساده را برمی گرداند.
با این حال، می توانید از
Gate::inspect
روش برای دریافت پاسخ مجوز کامل توسط گیت استفاده کنید:
$response = Gate::inspect('edit-settings', $post); if ($response->allowed()) { // The action is authorized...} else { echo $response->message();}
البته، هنگام استفاده از
Gate::authorize
روش پرتاب an
AuthorizationException
در صورتی که اقدام مجاز نباشد، پیام خطای ارائه شده توسط پاسخ مجوز به پاسخ
HTTP منتشر می شود:
Gate::authorize('edit-settings', $post); // The action is authorized...
رهگیری چک های دروازه
گاهی اوقات، ممکن است بخواهید تمام توانایی ها را به یک کاربر خاص اعطا
کنید.
میتوانید از این
before
روش برای تعریف تماس برگشتی استفاده کنید که قبل از سایر بررسیهای مجوز
اجرا میشود:
Gate::before(function ($user, $ability) { if ($user->isSuperAdmin()) { return true; }});
اگر
before
فراخوان یک نتیجه غیر تهی را برگرداند، آن نتیجه به عنوان نتیجه بررسی در
نظر گرفته می شود.
میتوانید از این
after
روش برای تعریف یک بازخوانی استفاده کنید تا پس از بررسیهای دیگر مجوز اجرا
شود:
Gate::after(function ($user, $ability, $result, $arguments) { if ($user->isSuperAdmin()) { return true; }});
مشابه
before
چک، اگر
after
فراخوان یک نتیجه غیر تهی برگرداند، آن نتیجه نتیجه چک در نظر گرفته می شود.
ایجاد سیاست ها
ایجاد سیاست ها
سیاست ها کلاس هایی هستند که منطق مجوز را حول یک مدل یا منبع خاص سازماندهی
می کنند.
به عنوان مثال، اگر برنامه شما یک وبلاگ است، ممکن است یک
Post
مدل و متناظر
PostPolicy
برای مجاز کردن اقدامات کاربر مانند ایجاد یا بهروزرسانی پستها داشته
باشید.
می توانید با استفاده از
make:policy
دستور artisan
یک خط مشی ایجاد کنید .
خط مشی ایجاد شده در
app/Policies
دایرکتوری قرار می گیرد.
اگر این دایرکتوری در برنامه شما وجود نداشته باشد، لاراول آن را برای شما
ایجاد می کند:
php artisan make:policy PostPolicy
این
make:policy
دستور یک کلاس سیاست خالی ایجاد می کند.
اگر میخواهید یک کلاس با روشهای خطمشی اصلی «CRUD» که قبلاً در کلاس
گنجانده شده است ایجاد کنید، میتوانید
--model
هنگام اجرای دستور، a را مشخص کنید:
php artisan make:policy PostPolicy --model=Post
تمام خط مشی ها از طریق کانتینر سرویس لاراول حل می شوند و به شما این امکان را می دهند که هر وابستگی مورد نیاز را در سازنده خط مشی تایپ کنید تا به طور خودکار آنها را تزریق کنید.
سیاست های ثبت نام
هنگامی که سیاست وجود دارد، باید ثبت شود.
برنامههای
AuthServiceProvider
جدید لاراول شامل
policies
ویژگیهایی هستند که مدلهای Eloquent شما را با خطمشیهای مربوطه خود
ترسیم میکند.
ثبت یک خطمشی به لاراول دستور میدهد که از کدام خطمشی برای تأیید اقدامات
علیه یک مدل خاص استفاده کند:
<?php namespace App\Providers; use App\Policies\PostPolicy;use App\Post;use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;use Illuminate\Support\Facades\Gate; class AuthServiceProvider extends ServiceProvider{ /** * The policy mappings for the application. * * @var array */ protected $policies = [ Post::class => PostPolicy::class, ]; /** * Register any application authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); // }}
کشف خودکار خط مشی
بهجای ثبت دستی خطمشیهای مدل، لاراول میتواند خطمشیها را بهطور
خودکار کشف کند تا زمانی که مدل و خطمشی از قراردادهای نامگذاری استاندارد لاراول پیروی کنند.
به طور خاص، سیاست ها باید در
Policies
دایرکتوری زیر دایرکتوری حاوی مدل ها باشند.
بنابراین، برای مثال، مدلها ممکن است در
app
فهرست قرار گیرند، در حالی که سیاستها ممکن است در
app/Policies
فهرست قرار گیرند.
علاوه بر این، نام خط مشی باید با نام مدل مطابقت داشته باشد و دارای
Policy
پسوند باشد.
بنابراین، یک
User
مدل با یک کلاس مطابقت دارد
UserPolicy
.
اگر میخواهید منطق کشف خطمشی خود را ارائه دهید، میتوانید با استفاده از
این
Gate::guessPolicyNamesUsing
روش، یک پاسخ تماس سفارشی ثبت کنید.
boot
به طور معمول، این متد باید از روش برنامه شما
فراخوانی شود
AuthServiceProvider
:
use Illuminate\Support\Facades\Gate; Gate::guessPolicyNamesUsing(function ($modelClass) { // return policy class name...});
هر خطمشی که به صراحت در شما ترسیم شده است،
AuthServiceProvider
بر هر خطمشی بالقوه کشف شده خودکار اولویت دارد.
سیاست های نوشتن
روش های سیاست گذاری
هنگامی که خط مشی ثبت شد، می توانید روش هایی را برای هر اقدامی که مجوز می
دهد اضافه کنید.
به عنوان مثال، بیایید
update
روشی را در خود تعریف کنیم
PostPolicy
که تعیین می کند آیا یک داده می تواند یک
نمونه
User
معین را به روز کند یا خیر .
Post
این متد یک
و یک نمونه را به عنوان آرگومان های خود
update
دریافت می کند
و باید برگردد
یا
نشان دهد که آیا کاربر مجاز به به روز رسانی داده شده است یا خیر
.
بنابراین، برای این مثال، اجازه دهید بررسی کنیم که کاربر
با پست
مطابقت دارد :
User
Post
true
false
Post
id
user_id
<?php namespace App\Policies; use App\Post;use App\User; class PostPolicy{ /** * Determine if the given post can be updated by the user. * * @param \App\User $user * @param \App\Post $post * @return bool */ public function update(User $user, Post $post) { return $user->id === $post->user_id; }}
میتوانید به تعریف روشهای اضافی روی خطمشی در صورت نیاز برای اقدامات
مختلفی که مجوز میدهد، ادامه دهید.
برای مثال، ممکن است روشهایی را برای مجوز دادن به اقدامات مختلف تعریف
کنید
view
،
delete
اما
Post
به یاد داشته باشید که میتوانید به روشهای خطمشی خود هر نامی که دوست
دارید بدهید.
اگر
--model
هنگام ایجاد خطمشی خود از طریق کنسول Artisan از این گزینه استفاده کردهاید، از قبل حاوی روشهایی برایviewAny
,view
,create
,update
,delete
,restore
وforceDelete
اقدامات است.
پاسخ های خط مشی
تا کنون، ما فقط روشهای سیاستی را بررسی کردهایم که مقادیر بولی ساده را
برمیگردانند.
با این حال، گاهی اوقات ممکن است بخواهید پاسخ دقیق تری، از جمله یک پیام
خطا، بازگردانید.
برای انجام این کار، می توانید
Illuminate\Auth\Access\Response
از روش خط مشی خود یک عدد را برگردانید:
use Illuminate\Auth\Access\Response; /** * Determine if the given post can be updated by the user. * * @param \App\User $user * @param \App\Post $post * @return \Illuminate\Auth\Access\Response */public function update(User $user, Post $post){ return $user->id === $post->user_id ? Response::allow() : Response::deny('You do not own this post.');}
هنگام برگرداندن پاسخ مجوز از خط مشی شما،
Gate::allows
روش همچنان یک مقدار بولی ساده را برمی گرداند.
با این حال، می توانید از
Gate::inspect
روش برای دریافت پاسخ مجوز کامل توسط گیت استفاده کنید:
$response = Gate::inspect('update', $post); if ($response->allowed()) { // The action is authorized...} else { echo $response->message();}
البته، هنگام استفاده از
Gate::authorize
روش پرتاب an
AuthorizationException
در صورتی که اقدام مجاز نباشد، پیام خطای ارائه شده توسط پاسخ مجوز به پاسخ
HTTP منتشر می شود:
Gate::authorize('update', $post); // The action is authorized...
روشهای بدون مدل
برخی از روشهای خطمشی فقط کاربر تأیید شده فعلی را دریافت میکنند و
نمونهای از مدلی را که مجاز کردهاند دریافت نمیکنند.
این وضعیت در هنگام مجوز دادن به اقدامات رایج است
create
.
به عنوان مثال، اگر در حال ایجاد یک وبلاگ هستید، ممکن است بخواهید بررسی
کنید که آیا کاربر اصلاً مجاز به ایجاد هرگونه پست است یا خیر.
هنگام تعریف روشهای خطمشی که نمونهای از مدل را دریافت نمیکنند، مانند
روش
create
، نمونهای از مدل را دریافت نمیکند.
در عوض، شما باید روش را طوری تعریف کنید که فقط از کاربر تأیید شده انتظار
دارد:
/** * Determine if the given user can create posts. * * @param \App\User $user * @return bool */public function create(User $user){ //}
کاربران مهمان
بهطور پیشفرض،
false
اگر درخواست HTTP دریافتی توسط کاربر احراز هویت شده آغاز نشده باشد، همه
گیتها و خطمشیها بهطور خودکار برمیگردند.
null
با این حال، میتوانید با اعلام یک نوع اشاره «اختیاری» یا ارائه یک مقدار
پیشفرض برای تعریف آرگومان کاربر،
اجازه دهید این بررسیهای مجوز به گیتها و خطمشیهای شما منتقل شوند :
<?php namespace App\Policies; use App\Post;use App\User; class PostPolicy{ /** * Determine if the given post can be updated by the user. * * @param \App\User $user * @param \App\Post $post * @return bool */ public function update(?User $user, Post $post) { return optional($user)->id === $post->user_id; }}
فیلترهای خط مشی
برای کاربران خاصی، ممکن است بخواهید همه اقدامات را در یک خط مشی مشخص مجاز
کنید.
برای انجام این کار،
before
روشی را روی خط مشی تعریف کنید.
این
before
متد قبل از هر روش دیگری در خط مشی اجرا می شود و به شما فرصتی می دهد تا
قبل از فراخوانی روش سیاست مورد نظر، اقدام را مجاز کنید.
این ویژگی بیشتر برای اجازه دادن به مدیران برنامه برای انجام هر عملی
استفاده می شود:
public function before($user, $ability){ if ($user->isSuperAdmin()) { return true; }}
اگر می خواهید همه مجوزها را برای یک کاربر رد کنید، باید
false
از
before
روش برگردید.
اگر
null
بازگردانده شود، مجوز از طریق روش سیاست قرار می گیرد.
before
اگر کلاس حاوی متدی با نامی مطابق با نام توانایی در حال بررسی نباشد، متد یک کلاس سیاست فراخوانی نخواهد شد .
مجوز اقدامات با استفاده از خط مشی ها
از طریق مدل کاربر
مدلی
User
که در برنامه لاراول شما گنجانده شده است شامل دو روش مفید برای مجوز دادن
به اقدامات است:
can
و
cant
.
متد
can
اقدامی را که میخواهید مجاز کنید و مدل مربوطه را دریافت میکند.
به عنوان مثال، اجازه دهید تعیین کنیم که آیا کاربر مجاز به به روز رسانی یک
Post
مدل معین است یا خیر:
if ($user->can('update', $post)) { //}
اگر یک خط مشی
برای مدل داده شده
ثبت شود
can
، متد به طور خودکار خط مشی مناسب را فراخوانی می کند و نتیجه بولی را برمی
گرداند.
اگر هیچ خط مشی برای مدل ثبت نشده باشد، این
can
روش سعی می کند دروازه مبتنی بر بسته شدن را که با نام عمل داده شده مطابقت
دارد فراخوانی کند.
اقداماتی که به مدل نیاز ندارند
به یاد داشته باشید، برخی از اقدامات مانند
create
ممکن است نیازی به یک نمونه مدل نداشته باشند.
در این مواقع، می توانید نام کلاس را به
can
متد ارسال کنید.
از نام کلاس برای تعیین اینکه از کدام خط مشی هنگام مجوز دادن به عملکرد
استفاده شود استفاده می شود:
use App\Post; if ($user->can('create', Post::class)) { // Executes the "create" method on the relevant policy...}
از طریق Middleware
لاراول شامل یک میان افزار است که می تواند اقدامات را قبل از اینکه درخواست
ورودی حتی به مسیرها یا کنترلرهای شما برسد مجوز دهد.
به طور پیشفرض،
کلید میانافزار در کلاس شما
Illuminate\Auth\Middleware\Authorize
به آن اختصاص داده میشود
.
بیایید نمونهای از استفاده از
میانافزار برای اجازه دادن به کاربر برای بهروزرسانی یک پست وبلاگ را
بررسی کنیم:
can
App\Http\Kernel
can
use App\Post; Route::put('/post/{post}', function (Post $post) { // The current user may update the post...})->middleware('can:update,post');
در این مثال، ما
can
دو آرگومان میان افزار را ارسال می کنیم.
اولی نام اقدامی است که میخواهیم مجوز دهیم و دومی پارامتر مسیری است که
میخواهیم به متد Policy منتقل کنیم.
در این حالت، از آنجایی که از binding مدل ضمنی
استفاده می کنیم
، یک
Post
مدل به روش Policy منتقل می شود.
اگر کاربر مجاز به انجام عمل داده شده نباشد، یک پاسخ HTTP با
403
کد وضعیت توسط میان افزار تولید می شود.
اقداماتی که به مدل نیاز ندارند
باز هم، برخی از اقدامات مانند
create
ممکن است نیازی به یک نمونه مدل نداشته باشند.
در این مواقع، ممکن است نام کلاس را به میان افزار منتقل کنید.
از نام کلاس برای تعیین اینکه از کدام خط مشی هنگام مجوز دادن به عملکرد
استفاده شود استفاده می شود:
Route::post('/post', function () { // The current user may create posts...})->middleware('can:create,App\Post');
از طریق Controller Helpers
User
لاراول
علاوه بر روشهای مفیدی که برای مدل ارائه میشود ، یک
authorize
روش مفید برای هر یک از کنترلکنندههای شما ارائه میکند که
App\Http\Controllers\Controller
کلاس پایه را گسترش میدهد.
مانند
can
متد، این روش نیز نام اقدامی را که میخواهید مجاز کنید و مدل مربوطه را
میپذیرد.
اگر عمل مجاز نباشد،
authorize
متد یک را پرتاب میکند
Illuminate\Auth\Access\AuthorizationException
، که کنترلکننده استثنای لاراول پیشفرض آن را به یک پاسخ HTTP با
403
کد وضعیت تبدیل میکند:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller;use App\Post;use Illuminate\Http\Request; class PostController extends Controller{ /** * Update the given blog post. * * @param Request $request * @param Post $post * @return Response * @throws \Illuminate\Auth\Access\AuthorizationException */ public function update(Request $request, Post $post) { $this->authorize('update', $post); // The current user can update the blog post... }}
اقداماتی که به مدل نیاز ندارند
همانطور که قبلاً بحث شد، برخی از اقدامات مانند
create
ممکن است به یک نمونه مدل نیاز نداشته باشند.
در این مواقع باید یک نام کلاس به
authorize
متد ارسال کنید.
از نام کلاس برای تعیین اینکه از کدام خط مشی هنگام مجوز دادن به عملکرد
استفاده شود استفاده می شود:
/** * Create a new blog post. * * @param Request $request * @return Response * @throws \Illuminate\Auth\Access\AuthorizationException */public function create(Request $request){ $this->authorize('create', Post::class); // The current user can create blog posts...}
مجوز کنترل منابع
اگر از کنترل کننده های منبع
استفاده می کنید
، می توانید از
authorizeResource
روش موجود در سازنده کنترلر استفاده کنید.
این روش تعاریف میان افزار مناسب را
can
به روش های کنترل کننده منابع متصل می کند.
این
authorizeResource
متد نام کلاس مدل را به عنوان اولین آرگومان خود و نام پارامتر route /
request را که حاوی ID مدل به عنوان آرگومان دوم است می پذیرد.
باید اطمینان حاصل کنید که
کنترل کننده منبع
شما با
--model
پرچم ایجاد شده است تا دارای امضاهای روش مورد نیاز و نکات نوع باشد:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller;use App\Post;use Illuminate\Http\Request; class PostController extends Controller{ public function __construct() { $this->authorizeResource(Post::class, 'post'); }}
روشهای کنترلکننده زیر به روش سیاست مربوطه خود نگاشت میشوند:
روش کنترلر | روش سیاست گذاری |
---|---|
فهرست مطالب | مشاهده هر |
نشان می دهد | چشم انداز |
ايجاد كردن | ايجاد كردن |
فروشگاه | ايجاد كردن |
ویرایش کنید | به روز رسانی |
به روز رسانی | به روز رسانی |
از بین رفتن | حذف |
می توانید از
make:policy
دستور با--model
گزینه ای برای تولید سریع یک کلاس سیاست برای یک مدل داده شده استفاده کنید:php artisan make:policy PostPolicy --model=Post
.
از طریق قالب های Blade
هنگام نوشتن الگوهای Blade، ممکن است بخواهید بخشی از صفحه را تنها در صورتی
نمایش دهید که کاربر مجاز به انجام یک عمل خاص باشد.
به عنوان مثال، ممکن است بخواهید یک فرم به روز رسانی برای یک پست وبلاگ را
تنها در صورتی نشان دهید که کاربر واقعا بتواند پست را به روز کند.
در این شرایط، می توانید از دستورات
@can
و
@cannot
خانواده دستورات استفاده کنید:
@can('update', $post) <!-- The Current User Can Update The Post -->@elsecan('create', App\Post::class) <!-- The Current User Can Create New Post -->@endcan @cannot('update', $post) <!-- The Current User Cannot Update The Post -->@elsecannot('create', App\Post::class) <!-- The Current User Cannot Create A New Post -->@endcannot
این دستورالعمل ها میانبرهای مناسبی برای نوشتن
@if
و
@unless
بیانیه ها هستند.
عبارات
@can
و
@cannot
جملات بالا به ترتیب به عبارات زیر ترجمه می شوند:
@if (Auth::user()->can('update', $post)) <!-- The Current User Can Update The Post -->@endif @unless (Auth::user()->can('update', $post)) <!-- The Current User Cannot Update The Post -->@endunless
همچنین میتوانید تعیین کنید که آیا یک کاربر توانایی مجوزدهی از فهرست
مشخصی از تواناییها دارد یا خیر.
برای انجام این کار، از
@canany
دستورالعمل استفاده کنید:
@canany(['update', 'view', 'delete'], $post) // The current user can update, view, or delete the post@elsecanany(['create'], \App\Post::class) // The current user can create a post@endcanany
اقداماتی که به مدل نیاز ندارند
مانند بسیاری از روشهای مجوزدهی دیگر،
اگر عمل به نمونهای از مدل نیاز نداشته باشد، میتوانید نام کلاس را به
دستورالعملها
@can
و دستورالعملها ارسال کنید:
@cannot
@can('create', App\Post::class) <!-- The Current User Can Create Posts -->@endcan @cannot('create', App\Post::class) <!-- The Current User Can't Create Posts -->@endcannot
ارائه متن اضافی
هنگام مجوز دادن به اقدامات با استفاده از خطمشیها، میتوانید یک آرایه را
بهعنوان آرگومان دوم به توابع و کمککنندههای مختلف مجوز ارسال کنید.
اولین عنصر در آرایه برای تعیین اینکه کدام خط مشی باید فراخوانی شود
استفاده می شود، در حالی که بقیه عناصر آرایه به عنوان پارامتر به روش خط مشی ارسال می شوند و می توانند برای
زمینه اضافی در هنگام تصمیم گیری مجوز استفاده شوند.
به عنوان مثال، تعریف روش زیر را در نظر بگیرید که حاوی یک
پارامتر
PostPolicy
اضافی است :
$category
/** * Determine if the given post can be updated by the user. * * @param \App\User $user * @param \App\Post $post * @param int $category * @return bool */public function update(User $user, Post $post, int $category){ return $user->id === $post->user_id && $category > 3;}
هنگام تلاش برای تعیین اینکه آیا کاربر تأیید شده می تواند یک پست داده شده را به روز کند یا خیر، می توانیم این روش خط مشی را به این صورت فراخوانی کنیم:
/** * Update the given blog post. * * @param Request $request * @param Post $post * @return Response * @throws \Illuminate\Auth\Access\AuthorizationException */public function update(Request $request, Post $post){ $this->authorize('update', [$post, $request->input('category')]); // The current user can update the blog post...}