Keizinan pengguna


    • Pengenalan
    Gates
  • Tulis Gates
    • Tindakan Kebenaran
    • Pemeriksaan Pemintasan Pintu
  • Buat Polisi
    • Jana Polisi
    • Strategi Penulisan
    Kaedah Strategi
  • Tidak mengandungi kaedah model
    • Tetamu - Pengguna
    • Penapis dasar
    • Gunakan polisi untuk membenarkan tindakan
    Melalui perisian tengah

Melalui Pengawal Fungsi Pembantu

Melalui Templat Pisau

Pengenalan
Selain 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.

Apabila membina aplikasi, anda tidak perlu memilih antara menggunakan gate secara eksklusif atau menggunakan strategi sahaja. Kebanyakan aplikasi mungkin akan mengandungi kedua-dua gerbang dan dasar, dan ia akan berfungsi dengan baik. Gates kebanyakannya digunakan di tempat di mana model dan sumber tidak berkaitan, seperti melihat panel pentadbir. Sebaliknya, strategi harus digunakan dalam model atau sumber tertentu.

🎜🎜🎜🎜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.imageposts.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 kaedah resource 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();   
            //   
     }
   }
Takrifan manual di atas mempunyai kesan yang sama seperti definisi Gerbang berikut:

use Illuminate\Support\Facades\Gate;
Gate::guessPolicyNamesUsing(function ($modelClass) {
    // return policy class name...
 });

Secara lalai, lihat, buat, kemas kini dan kaedah 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;   
     }
 }

Tindakan yang dibenarkan🎜🎜Apabila menggunakan get untuk membenarkan tindakan, anda harus menggunakan membenarkan atau menafikan 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 方法注册自定义回调。通常,应该从应用程序的 AuthServiceProviderboot 方法调用此方法:

<?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.

Mendaftar Polisi

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 方法接收 UserPost 实例作为参数,并且应该返回 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 选项,它会包含进去 viewcreateupdatedelete 动作方法。

不包含模型方法

一些策略方法只接收当前认证通过的用户作为参数,而不用传入与授权相关的模型实例。最常见的应用场景就是授权 create 动作。比如,如果你正在创建一篇博客,你可能希望先检查一下当前用户是否有权限创建它。

当定义一个不需要传入模型实例的策略方法时,比如 create 方法,它就是不接收模型实例作为参数。你应该定义这个方法只接收授权过的用户作为参数。

rrreee

访客用户

默认情况下,如果传入的 HTTP 请求不是经过身份验证的用户发起的,那么所有的 gates 和策略都会自动返回 false。 然而,你可以允许这些授权检查通过声明一个『可选的』类型提示或为用户参数定义提供 null

Kaedahkemas kini menerima kejadian Pengguna dan Post sebagai parameter dan harus mengembalikan true atau false 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.

rrreeeAnda boleh terus menentukan kaedah tambahan untuk dasar kebenaran ini. Sebagai contoh, anda boleh mentakrifkan kaedah lihat atau delete untuk membenarkan pelbagai gelagat Post dan anda juga boleh mencipta kaedah strategi tersuai anda sendiri nama.

{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 模型包含两个有用的方法来授权动作: cancant。这个 can 方法需要指定授权的动作以及相关的模型。例如,判断是否授权一个用户更新指定的 Post 模型:

rrreee

如果指定模型的 「策略已被注册 」, can 方法会自动调用合适的策略并返回一个 boolean 值。如果没有策略注册到这个模型,can 方法会尝试调用和指定动作名称相匹配的基于闭包的 Gate。

不需要指定模型的动作

记住,一些动作,比如 create 并不需要指定模型实例。在这种情况下,可传递一个类名给 can 方法。这个类名将被用于判定使用哪种策略授权动作:

rrreee

通过中间件

Laravel 包含一个可以在请求到达路由或者控制器之前就进行动作授权的中间件。默认情况下, IlluminateAuthMiddlewareAuthorize 中间件被指定到你的 AppHttpKernel 类中的 can 键上。让我们用一个授权用户更新博客的例子来讲解一下 can 这个中间件的使用:

rrreee

在这个例子中,我们传给了 can 中间件两个参数。第一个参数是需要授权的动作名称,第二个参数是我们希望传递给策略方法的路由参数。在这种情况下,我们使用了「 隐式路由绑定」,一个 Post 模型会被传递给策略方法。如果用户不被授权访问指定的动作,这个中间件将会生成带有 403rrreee

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🎜🎜
🎜🎜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@cannotrrreee

Melalui fungsi tambahan pengawal

🎜Selain menyediakan kaedah tambahan dalam model User, Laravel juga menyediakan kawalan yang mewarisi kelas asas AppHttpControllersController 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
Artikel ini mula-mula muncul di tapak web LearnKu.com.