Keizinan pengguna
Melalui Pengawal Fungsi Pembantu
Melalui Templat PisauPengenalanSelain menyediakan perkhidmatan pengesahan kotak, pengguna juga menyediakan perkhidmatan pengesahan kotak yang mudah. Seperti pengesahan pengguna, kaedah kebenaran Laravel adalah mudah Terdapat dua cara utama untuk mengendalikan kebenaran: gerbang dan dasar. Gerbang dan strategi boleh dibandingkan dengan penghalaan dan pengawal. Gates menyediakan kaedah kebenaran berasaskan penutupan yang mudah, manakala dasar adalah serupa dengan pengawal dan melaksanakan pengesahan kebenaran dengan mengumpulkan logiknya di sekeliling model atau sumber tertentu. Kami meneroka pintu gerbang dahulu dan kemudian melihat strategi. 🎜🎜🎜🎜Gates🎜🎜🎜🎜🎜🎜🎜Writing Gates
Gates ialah fungsi penutupan yang digunakan untuk menentukan sama ada pengguna dibenarkan untuk melakukan tindakan yang diberikan, dan kaedah biasa ialah menggunakan Gate
dalam AppProvidersAuthServiceProvider
untuk takrifkannya. Gates sentiasa menerima contoh pengguna sebagai parameter pertama dan boleh menerima parameter pilihan, seperti model Eloquent yang berkaitan: AppProvidersAuthServiceProvider
中使用 Gate
来定义. Gates 总是接收一个用户实例作为第一个参数,并且可以接收可选参数,比如相关的 Eloquent 模型:
/** * 注册任意用户认证、用户授权服务。 * * @return void */ public function boot(){ $this->registerPolicies(); Gate::define('update-post', function ($user, $post) { return $user->id == $post->user_id; }); }
Gates 也可以使用类似控制器方法 Class@method
风格的回调字符串来定义:
/** * 注册任意用户认证、用户授权服务。 * * @return void */ public function boot(){ $this->registerPolicies(); Gate::define('update-post', 'App\Policies\PostPolicy@update'); }
资源 Gates
你还可以使用 resource
方法去一次性的定义多个 Gate 方法:
Gate::resource('posts', 'App\Policies\PostPolicy');
上面的手动定义和以下的 Gate 定义效果是相同的:
Gate::define('posts.view', 'App\Policies\PostPolicy@view'); Gate::define('posts.create', 'App\Policies\PostPolicy@create'); Gate::define('posts.update', 'App\Policies\PostPolicy@update'); Gate::define('posts.delete', 'App\Policies\PostPolicy@delete');
默认情况下将会定义 view
, create
, update
, 和 delete
方法。通过将一个数组作为第三个参数传给 resource
方法。你可以覆盖或者添加到默认的方法中。数组的键定义能力的名称,值定义方法的名称。例如,下面的代码将创建两个新的 Gate 定义 - posts.image
和 posts.photo
:
Gate::resource('posts', 'PostPolicy', [ 'image' => 'updateImage', 'photo' => 'updatePhoto', ]);
授权动作
使用 gates 来授权动作的时候, 你应该使用 allows
或者 denies
方法。 注意,不需要将当前已认证用户传递给这些方法。 Laravel 会自动处理好已经认证通过的用户,然后传递给 gete 闭包函数:
if (Gate::allows('update-post', $post)) { // 指定当前用户可以进行更新... } if (Gate::denies('update-post', $post)) { // 指定当前用户不能更新... }
如果你想判断一个特定的用户是否已经被授权访问某个动作, 你可以使用在 Gate
在 facade 的 forUser
方法:
if (Gate::forUser($user)->allows('update-post', $post)) { // 用户可以更新... } if (Gate::forUser($user)->denies('update-post', $post)) { // 用户不能更新... }
Gate 拦截检查
有时,你可能希望将所有能力授予特定用户。所以你可以在所有其他授权检查之前使用 before
方法来定义运行的回调:
Gate::before(function ($user, $ability) { if ($user->isSuperAdmin()) { return true; } });
如果 before
回调方法返回的是非 null 的结果,则结果将被视为检查结果。
在每次授权检查后你可以使用 after
方法定义要执行的回调。 但是,你不能从 after
回调方法中修改授权检查的结果:
Gate::after(function ($user, $ability, $result, $arguments) { // });
与 before
检查类似,如果 after
php artisan make:policy PostPolicy
Gates juga boleh menggunakan kaedah pengawal yang serupa
Class@method
style callbacks String untuk menentukan: php artisan make:policy PostPolicy --model=Post
Resource Gates
Anda juga boleh menggunakan kaedahresource
untuk mendapatkan sekali Takrifkan berbilang kaedah Gerbang: <?php namespace App\Providers; use App\Post;use App\Policies\PostPolicy; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider{ /** * 应用的策略映射。 * * @var array */ protected $policies = [ Post::class => PostPolicy::class, ]; /** * 注册任意应用认证、应用授权服务 * * @return void */ public function boot() { $this->registerPolicies(); // } }
use Illuminate\Support\Facades\Gate;
Gate::guessPolicyNamesUsing(function ($modelClass) {
// return policy class name...
});
Secara lalai, delete
. Dengan menghantar tatasusunan sebagai parameter ketiga kepada kaedah resource
. Anda boleh mengatasi atau menambah pada kaedah lalai. Kekunci tatasusunan menentukan nama keupayaan, dan nilai menentukan nama kaedah. Sebagai contoh, kod berikut akan mencipta dua takrifan Gate baharu - posts.image
dan posts.photo
:<?php namespace App\Policies;use App\User; use App\Post;class PostPolicy{ /** * 判断该方法能否被用户操作。 * * @param \App\User $user * @param \App\Post $post * @return bool */ public function update(User $user, Post $post) { return $user->id === $post->user_id; } }
membenarkan
atau menafikan kod> kaedah. Ambil perhatian bahawa pengguna yang disahkan semasa tidak perlu dihantar ke kaedah ini. Laravel akan mengendalikan pengguna yang disahkan secara automatik dan kemudian menghantarnya ke fungsi penutupan gete: 🎜/**
* 判断用户是否可以创建请求。
*
* @param \App\User $user
* @return bool
*/
public function create(User $user){
//
}
🎜 Jika anda ingin menentukan sama ada pengguna tertentu telah diberi kuasa untuk mengakses tindakan, anda boleh menggunakan Gate
untukUser
kaedah dalam fasad: 🎜<?php
namespace App\Policies;
use App\User;use App\Post;class PostPolicy{
/**
* 判断用户是否能更新指定帖子。
*
* @param \App\User $user
* @param \App\Post $post
* @return bool
*/
public function update(?User $user, Post $post)
{
return $user->id === $post->user_id;
}
}
🎜🎜🎜🎜 Get Interception Check< /h4>🎜Kadangkala, anda mungkin mahu memberikan semua keupayaan kepada pengguna tertentu. Jadi anda boleh menggunakan kaedah sebelum
untuk mentakrifkan panggilan balik yang dijalankan sebelum semua semakan kebenaran lain: 🎜public function before($user, $ability){
if ($user->isSuperAdmin()) {
return true;
}
}
🎜Jika kaedah panggil balik sebelum
mengembalikan hasil bukan nol, hasilnya akan dianggap sebagai hasil pemeriksaan. 🎜🎜Anda boleh menggunakan kaedah selepas untuk menentukan panggilan balik yang akan dilaksanakan selepas setiap semakan kebenaran. Walau bagaimanapun, anda tidak boleh mengubah suai hasil semakan kebenaran daripada kaedah panggil balik selepas
: 🎜if ($user->can('update', $post)) {
//
}
🎜Serupa dengan semakan sebelum
, jika selepas
panggilan balik mengembalikan bukan batal Keputusan akan dianggap sebagai hasil pemeriksaan. 🎜🎜🎜🎜🎜🎜🎜 Buat strategi 🎜🎜🎜🎜🎜🎜🎜Jana Dasar
Strategi ialah kelas yang mengatur logik kebenaran dalam model atau sumber tertentu. Contohnya, jika aplikasi anda ialah blog, maka apabila anda membuat atau mengemas kini blog, anda mungkin mempunyai model Post
dan Policy
yang sepadan untuk membenarkan tindakan pengguna. Post
模型和一个对应的 PostPolicy
来授权用户动作。
你可以使用 artisan 命令
artisan command 中的 make:policy
artisan command 命令来生成策略。 生成的策略将放置在 app/Policies
目录中。如果在你的应用中不存在这个目录,那么 Laravel 将会为你自动生成:
use App\Post;if ($user->can('create', Post::class)) {
// 执行相关策略中的 "create" 方法...
}
make:policy
命令会生成一个空的策略类。如果你想生成的类包含基本的 「CRUD」策略方法,你可以在执行命令的时候指定 --model
这个选项:
use App\Post;Route::put('/post/{post}', function (Post $post) {
// 当前用户可以进行更新操作...
})->middleware('can:update,post');
{tip} 所有的策略会通过 Laravel 的 服务容器,来解析,允许你在策略构造器中对任何需要的依赖使用类型提示,并且自动注入。
注册策略
一旦策略存在,它就需要进行注册。新的 Laravel 应用中包含的 AuthServiceProvider
有一个 policies
属性,可以将各种模型对应到它们的策略中。注册一个策略将引导 Laravel 在授权动作访问指定模型的时候使用哪种策略:
Route::post('/post', function () {
// 当前用户可以进行创建操作...
})->middleware('can:create,App\Post');
策略自动发现
只要模型和策略遵循标准的 Laravel 命名约定,Laravel 就可以自动发现策略,而不是手动注册模型策略。具体而言,策略必须位于包含模型的目录下的 Policies
目录中。因此,例如模型可以放在 app
目录中,而策略可以放在 app/Policies
目录中。此外,策略名称必须与模型名称匹配,并具有 Policy
后缀。因此,User
模型将对应于 UserPolicy
类。
如果您想提供自己的策略发现逻辑,可以使用 Gate :: guessPolicyNamesUsing
方法注册自定义回调。通常,应该从应用程序的 AuthServiceProvider
的 boot
方法调用此方法:
<?php
namespace App\Http\Controllers;
use App\Post;use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PostController extends Controller{
/**
* 更新指定博客帖子。
*
* @param Request $request
* @param Post $post
* @return Response
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);
// 当前用户可以更新博客...
}
}
{note} 在 AuthServiceProvider
Anda boleh menggunakan perintah perintah artisan make:policy
dalam perintah artisan perintah artisan
untuk menjana dasar. Dasar yang dijana akan diletakkan dalam direktori app/Policies
. Jika direktori ini tidak wujud dalam aplikasi anda, Laravel akan menjananya secara automatik untuk anda:
/**
* 创建一个新的博客
*
* @param Request $request
* @return Response
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function create(Request $request){
$this->authorize('create', Post::class);
// 当前用户可以新建博客...
}
Perintah make:policy
akan menjana kelas dasar kosong. Jika kelas yang anda ingin hasilkan mengandungi kaedah strategi asas "CRUD", anda boleh menentukan pilihan --model
apabila melaksanakan arahan: <?php
namespace App\Http\Controllers;
use App\Post;use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PostController extends Controller{
public function __construct()
{
$this->authorizeResource(Post::class, 'post');
}
}
{tip} Semua strategi akan lulus perkhidmatan Laravel bekas, untuk penghuraian, membolehkan anda menggunakan petunjuk jenis untuk sebarang kebergantungan yang diperlukan dalam pembina dasar dan minta ia disuntik secara automatik.
Setelah wujud, polisi itu perlu didaftarkan. AuthServiceProvider
yang disertakan dalam aplikasi Laravel baharu mempunyai atribut policies
yang memetakan pelbagai model kepada dasar mereka. Mendaftar dasar akan mengarahkan Laravel dasar yang hendak digunakan apabila membenarkan tindakan untuk mengakses model yang ditentukan: @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 Can't Update The Post -->
@elsecannot('create', App\Post::class)
<!-- The Current User Can't Create New Post -->
@endcannot
Dasar auto-penemuan
🎜Sebagaimana selagi model Dengan mengikut konvensyen dan strategi penamaan Laravel standard, Laravel boleh menemui strategi secara automatik dan bukannya mendaftarkan strategi model secara manual. Khususnya, dasar mesti terletak dalam direktori Policies
di bawah direktori yang mengandungi model. Jadi, sebagai contoh, model boleh diletakkan dalam direktori app
dan dasar boleh diletakkan dalam direktori app/Policies
. Selain itu, nama dasar mesti sepadan dengan nama model dan mempunyai akhiran Policy
. Oleh itu, model User
akan sepadan dengan kelas UserPolicy
. 🎜🎜Jika anda ingin memberikan logik penemuan dasar anda sendiri, anda boleh mendaftarkan panggilan balik tersuai menggunakan kaedah Gate::guessPolicyNamesUsing
. Biasanya, kaedah ini harus dipanggil daripada kaedah boot
AuthServiceProvider
aplikasi: 🎜@if (Auth::user()->can('update', $post))
<!-- The Current User Can Update The Post -->
@endif
@unless (Auth::user()->can('update', $post))
<!-- The Current User Can't Update The Post -->
@endunless
🎜{note} Secara eksplisit dalam AuthServiceProvider
Sebarang dasar yang dipetakan akan diutamakan daripada dasar autopenemuan. 🎜🎜🎜🎜🎜🎜🎜🎜🎜Strategi Penulisan🎜🎜🎜🎜🎜🎜🎜Kaedah Strategi
Setelah dasar kebenaran didaftarkan, anda boleh menambah kaedah untuk setiap tindakan selepas kebenaran. Sebagai contoh, kami mentakrifkan kaedah kemas kini
dalam PostPolicy
, yang akan menentukan sama ada Pengguna
yang ditentukan boleh mengemas kini Post
yang ditentukan > Contoh. PostPolicy
中定义一个 update
方法,它会判断指定的 User
是否可以更新指定的 Post
实例。
update
方法接收 User
和 Post
实例作为参数,并且应该返回 true
或者 false
来表明用户是否被授权更新指定的 Post
。所以在这个例子中,我们需要判断用户的 id
是否和 post 中的 user_id
匹配。
@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
你可以继续为这个授权策略定义额外的方法。比如,你可以定义 view
或者 delete
方法来授权 Post
的多种行为,还可以为自定义的策略方法起一个你自己喜欢的名字。
{tip} 如果在 Artisan 控制台生成策略时,使用 --model
选项,它会包含进去 view
,create
,update
和 delete
动作方法。
不包含模型方法
一些策略方法只接收当前认证通过的用户作为参数,而不用传入与授权相关的模型实例。最常见的应用场景就是授权 create
动作。比如,如果你正在创建一篇博客,你可能希望先检查一下当前用户是否有权限创建它。
当定义一个不需要传入模型实例的策略方法时,比如 create
方法,它就是不接收模型实例作为参数。你应该定义这个方法只接收授权过的用户作为参数。
rrreee访客用户
默认情况下,如果传入的 HTTP 请求不是经过身份验证的用户发起的,那么所有的 gates 和策略都会自动返回 false
。 然而,你可以允许这些授权检查通过声明一个『可选的』类型提示或为用户参数定义提供 null
Kaedahkemas kini menerima kejadian Pengguna
dan Post
sebagai parameter dan harus mengembalikan true
atau false / code> untuk menunjukkan sama ada pengguna dibenarkan untuk mengemas kini Post
yang ditentukan. Jadi dalam contoh ini, kita perlu menentukan sama ada id
pengguna sepadan dengan user_id
dalam siaran. {tip} Jika anda menggunakan pilihan --model
semasa menjana strategi dalam konsol Artisan, ia akan disertakan dalam view
, create Kaedah tindakan
, kemas kini
dan delete
. 🎜🎜🎜🎜Tidak mengandungi kaedah model 🎜🎜Sesetengah kaedah dasar hanya menerima pengesahan semasa Lulus pengguna sebagai parameter dan bukannya lulus dalam contoh model berkaitan kebenaran. Senario aplikasi yang paling biasa adalah untuk membenarkan tindakan create
. Contohnya, jika anda mencipta blog, anda mungkin mahu menyemak dahulu sama ada pengguna semasa mempunyai kebenaran untuk menciptanya. 🎜🎜Apabila mentakrifkan kaedah strategi yang tidak memerlukan lulus dalam contoh model, seperti kaedah create
, ia tidak menerima contoh model sebagai parameter. Anda harus menentukan kaedah ini untuk hanya menerima pengguna yang dibenarkan sebagai parameter. 🎜rrreee🎜🎜🎜🎜🎜Pengguna tetamu🎜🎜Secara lalai jika permintaan HTTP yang masuk tidak disahkan Jika dimulakan oleh pengguna, semua gerbang dan dasar akan mengembalikan false
secara automatik. Walau bagaimanapun, anda boleh membenarkan semakan kebenaran ini dihantar ke pintu dan dasar anda dengan mengisytiharkan pembayang jenis "pilihan" atau memberikan nilai lalai null
untuk takrifan parameter pengguna: 🎜rrreee🎜🎜🎜 🎜🎜🎜Penapis Dasar
Untuk pengguna tertentu, anda mungkin mahu membenarkan semua tindakan melalui dasar yang ditentukan. Untuk mencapai matlamat ini, anda boleh menentukan kaedah sebelum
dalam strategi. Kaedah sebelum
akan dilaksanakan sebelum semua kaedah lain dalam dasar, sekali gus menyediakan cara untuk membenarkan tindakan selain daripada kaedah dasar yang ditentukan untuk melaksanakan pertimbangan. Senario yang paling biasa untuk ciri ini ialah pentadbir aplikasi yang dibenarkan mempunyai akses kepada semua tindakan: before
方法。 before
方法会在策略中其它所有方法之前执行,这样提供了一种方式来授权动作而不是指定的策略方法来执行判断。这个功能最常见的场景是授权应用的管理员可以访问所有动作:
rrreee如果你想拒绝某个用户所有的授权,你应当在 before
方法中返回 false
。如果返回值是 null
,那么授权会在这个策略中失败。
{note} 策略类的 before
方法不会被调用,如果该类不包含与被检查的功能名称相符的方法。
使用策略授权动作
通过用户模型
Laravel 内置的 User
模型包含两个有用的方法来授权动作: can
和 cant
。这个 can
方法需要指定授权的动作以及相关的模型。例如,判断是否授权一个用户更新指定的 Post
模型:
rrreee如果指定模型的 「策略已被注册 」, can
方法会自动调用合适的策略并返回一个 boolean 值。如果没有策略注册到这个模型,can
方法会尝试调用和指定动作名称相匹配的基于闭包的 Gate。
不需要指定模型的动作
记住,一些动作,比如 create
并不需要指定模型实例。在这种情况下,可传递一个类名给 can
方法。这个类名将被用于判定使用哪种策略授权动作:
rrreee通过中间件
Laravel 包含一个可以在请求到达路由或者控制器之前就进行动作授权的中间件。默认情况下, IlluminateAuthMiddlewareAuthorize
中间件被指定到你的 AppHttpKernel
类中的 can
键上。让我们用一个授权用户更新博客的例子来讲解一下 can
这个中间件的使用:
rrreee在这个例子中,我们传给了 can
中间件两个参数。第一个参数是需要授权的动作名称,第二个参数是我们希望传递给策略方法的路由参数。在这种情况下,我们使用了「 隐式路由绑定」,一个 Post
模型会被传递给策略方法。如果用户不被授权访问指定的动作,这个中间件将会生成带有 403
rrreee
Jika anda ingin menafikan semua kebenaran kepada pengguna, anda harus mengembalikan false< dalam sebelum< /kod> kaedah /kod> . Jika nilai pulangan ialah null
, maka kebenaran akan gagal dalam dasar ini. {note} Kaedah sebelum
kelas strategi tidak akan dipanggil jika kelas itu tidak mengandungi kaedah dengan nama fungsi yang sedang diperiksa. 🎜🎜🎜🎜Menggunakan tindakan kebenaran dasar h2>🎜🎜🎜🎜Oleh model pengguna🎜🎜Laravel terbina dalam Model Pengguna mengandungi dua kaedah berguna untuk membenarkan tindakan: can
dan cant
. Kaedah can
ini perlu menentukan tindakan yang dibenarkan dan model yang berkaitan. Contohnya, untuk menentukan sama ada pengguna dibenarkan untuk mengemas kini model Post
tertentu: 🎜rrreee🎜Jika "dasar model yang dinyatakan telah didaftarkan", < Kaedah kod>boleh akan memanggil strategi yang sesuai secara automatik dan mengembalikan nilai boolean. Jika tiada strategi didaftarkan dengan model ini, kaedah can
akan cuba memanggil Gate berasaskan penutupan yang sepadan dengan nama tindakan yang ditentukan. 🎜🎜Tidak perlu menentukan tindakan model
🎜Ingat, beberapa tindakan, seperti create
tidak perlu menjadi contoh Model yang ditentukan. Dalam kes ini, hantarkan nama kelas kepada kaedah can
. Nama kelas ini akan digunakan untuk menentukan tindakan kebenaran dasar yang hendak digunakan: 🎜rrreee🎜🎜🎜🎜 Pass Middleware🎜🎜Laravel termasuk perisian tengah yang boleh membenarkan tindakan sebelum permintaan sampai ke laluan atau pengawal. Secara lalai, perisian tengah IlluminateAuthMiddlewareAuthorize
diperuntukkan kepada kekunci can
dalam kelas AppHttpKernel
anda. Mari kita gunakan contoh pengguna yang dibenarkan mengemas kini blog untuk menerangkan penggunaan perisian tengah can
: 🎜rrreee🎜Dalam contoh ini, kami melepasi dua parameter middleware can
. Parameter pertama ialah nama tindakan yang memerlukan keizinan, dan parameter kedua ialah parameter penghalaan yang ingin kami hantar kepada kaedah dasar. Dalam kes ini, kami menggunakan "pengikatan laluan tersirat" dan model Post
akan dihantar kepada kaedah strategi. Jika pengguna tidak dibenarkan untuk mengakses tindakan yang ditentukan, perisian tengah ini akan menjana respons HTTP dengan kod status 403
. 🎜🎜🎜Tidak perlu menentukan tindakan model
Begitu juga, beberapa tindakan seperti membuat
mungkin tidak memerlukan contoh model. Dalam kes ini, anda boleh menghantar nama kelas kepada perisian tengah. Apabila membenarkan tindakan ini, nama kelas ini akan digunakan untuk menentukan strategi yang hendak digunakan: create
这样的动作可能不需要模型实例。在这种情况下,你可以传一个类名给中间件。当授权这个动作时,这个类名将被用来判断使用哪个策略:
rrreee通过控制器辅助函数
除了在 User
模型中提供辅助方法以外,Laravel 也为继承 AppHttpControllersController
这个基类的控制器提供了一个有用的 authorize
方法。就像 can
方法一样,这个方法需要接收你想授权的动作和相关的模型作为参数。如果这个动作没有被授权, authorize
方法会抛出一个 IlluminateAuthAccessAuthorizationException
的异常,然后 Laravel 默认的异常处理器会将这个异常转化成带有 403
状态码的 HTTP 响应。
rrreee不需要指定模型的动作
和之前讨论的一样,一些动作,比如 create
并不需要指定模型实例的动作。在这种情况下,你可以传递一个类名给 authorize
方法。当授权这个动作时,这个类名将被用来判断使用哪个策略:
rrreee授权资源控制器
如果你使用的是 资源控制器,那么你就可以在控制器构造方法里使用 authorizeResource
方法。该方法会把合适 can
中间件附加到资源控制器相应的方法中。
authorizeResource
方法接收模板类名作为第一个参数,包含模型 ID 的路由 / 请求参数的名称作为其第二个参数:
rrreee{提示} 你可以使用带有 --model
选项的 make:policy
命令去快速生成基于给定模型的策略类::php artisan make:policy PostPolicy --model=Post
。
通过 Blade 模板
当编写 Blade 模板时,你可能希望页面的指定部分只展示给授权访问指定动作的用户。比如,你可能希望只展示更新的表单给有权更新博客的用户。在这样情况下,你可以使用 @can
和 @cannot
等一系列指令:
rrreee这些指令是编写 @if
和 @unless
语句的捷径。 @can
和 @cannot
rrreee
Melalui fungsi tambahan pengawal
🎜Selain menyediakan kaedah tambahan dalam model User
, Laravel juga menyediakan kawalan yang mewarisi kelas asas AppHttpControllersController code> Pengarang menyediakan kaedah authorize
yang berguna. Sama seperti kaedah can
, kaedah ini mengambil sebagai parameter tindakan yang anda ingin benarkan dan model yang berkaitan. Jika tindakan ini tidak dibenarkan, kaedah authorize
akan membuang pengecualian IlluminateAuthAccessAuthorizationException
, dan kemudian pengendali pengecualian lalai Laravel akan menukar pengecualian ini menjadi pengecualian dengan 403 < /code> Kod status untuk respons HTTP. 🎜rrreee🎜🎜Tidak perlu menentukan tindakan model🎜🎜Seperti yang dibincangkan sebelum ini, beberapa tindakan, seperti create
tidak perlu menentukan tindakan contoh model. Dalam kes ini, anda boleh menghantar nama kelas kepada kaedah membenarkan
. Apabila membenarkan tindakan ini, nama kelas ini akan digunakan untuk menentukan strategi yang hendak digunakan: 🎜rrreee🎜🎜Izinkan Pengawal Sumber🎜🎜Jika anda menggunakan pengawal sumber , maka anda boleh menggunakan kaedah authorizeResource
dalam pembina pengawal. Kaedah ini akan melampirkan perisian tengah can
yang sesuai kepada kaedah pengawal sumber yang sepadan. Kaedah 🎜🎜authorizeResource
menerima nama kelas templat sebagai parameter pertama dan nama parameter laluan/permintaan yang mengandungi ID model sebagai parameter kedua: 🎜rrreee🎜{Tip} Anda boleh menggunakan Gunakan perintah make:policy
dengan pilihan --model
untuk menjana kelas dasar dengan cepat berdasarkan model tertentu: php artisan make:policy PostPolicy - -model= Pos
. 🎜
🎜🎜🎜Melalui templat Blade
🎜 Semasa menulis templat Blade, anda mungkin mahu bahagian tertentu halaman dipaparkan hanya kepada pengguna yang diberi kuasa untuk mengakses tindakan tertentu. Sebagai contoh, anda mungkin mahu memaparkan borang yang dikemas kini hanya kepada pengguna yang mempunyai kebenaran untuk mengemas kini blog mereka. Dalam kes ini, anda boleh menggunakan satu siri arahan seperti @can
dan @cannot
: 🎜rrreee🎜Arahan ini ditulis oleh @if
dan < Jalan pintas untuk penyataan kod>@kecuali. Pernyataan @can
dan @cannot
ditukar kepada pernyataan berikut masing-masing: 🎜rrreee🎜🎜Tindakan tanpa model
Seperti kebanyakan kaedah kebenaran lain, jika tindakan itu tidak memerlukan contoh model, anda boleh menghantar nama kelas kepada arahan @ can
和 @ cannot
:
rrreee