介绍

我了解了 Laravel 的授权,所以这是输出。

什么是授权?

官方的(https://readouble.com/laravel/9.x/ja/authorization.html)

用户可能已通过身份验证,但可能无权更新或删除由您的应用程序管理的某些 Eloquent 模型或数据库记录。 Laravel 的授权功能提供了一种简单而有条理的方式来管理这些类型的授权检查。

在 CRUD 处理中,发帖、编辑、删除等基本可以自由操作,但是如果别人未经允许删除你的帖子就不好了。有两种方法可以防止它,“门”和“策略”,并且在构建应用程序时,两者可能会混合使用。暂时我想把这次的政策重点放在输出上。

适用于与模型或资源无关的操作,例如查看仪表板。

政策

适用于授权特定模型或资源操作。例如,如果您在 Post 模型中创建 post、edit 和 delete 函数方法,请创建与 Post 模型对应的 Post 策略并设置授权。

政策制定

您可以使用 artisan 命令创建策略。您可以使用 make:policy 命令生成一个空的策略类。

$ ./vendor/bin/sail php artisan make:policy ContactFormPolicy

添加 --model=ContactFom 选项将在类中创建与显示、创建、更新和删除相关的方法。

$ % ./vendor/bin/sail php artisan make:policy ContactFormPolicy --model=ContactForm

保单登记

策略不能仅仅通过创建一个类来起作用,你需要将模型对应的策略附加到 Laravel 中。这时候一定要设置策略名称和模型同名。

app/Providers/AuthServiceProvider.php
<?php

namespace App\Providers;

// use Illuminate\Support\Facades\Gate;

use App\Models\ContactForm;
use App\Policies\ContactFormPolicy;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The model to policy mappings for the application.
     *
     * @var array<class-string, class-string>
     */
    protected $policies = [
        // モデル => モデルポリシー
        ContactForm::class => ContactFormPolicy::class   // ←ここを追記
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        //
    }
}

编写策略方法

为您授权的每个操作添加一个方法(索引/创建/删除)。参考官方示例,设置为其他用户无法更新User创建的内容。

<?php

namespace App\Policies;

use App\Models\ContactForm;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class ContactFormPolicy
{
    /**
     * 指定した投稿をユーザーが更新可能かを判定
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\ContactForm  $contactForm
     * @return \Illuminate\Auth\Access\Response|bool
     */
    public function update(User $user, ContactForm $contactForm)
    {
        return $user->id === $contactForm->user_id;       //←ここを記載
    }
}

这一次,user表和contactform表处于一对多的状态。 Laravel 認可について

使用 Usr 模型和 can 方法进行授权

Laravel 的 User 模型有方法“can”和“cannnot”用于授权动作,它似乎接收到要授权的动作的名称和关联的方法。

应用程序/Http/Controllers/ContactFormController.php
 /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $contact = ContactForm::find($id);
        if ($request->user()->can('update', $contact)) {   //canメソッドを使用した認可
            $contact->fill([                               //update処理
                'name' => $request->your_name,
                'title' => $request->title,
                'email' => $request->email,
                'url' => $request->url,
                'gender' => $request->gender,
                'age' => $request->age,
                'contact' => $request->contact,
            ]);
            $contact->save();
            return redirect()
                ->route('contact.index');
        } else {                                         //elseで条件分岐(createしたユーザーと同じでない時)
            abort(403);                                  //仮で403を表示、redirectを使い任意のページ可
        }
    }

使用 authorize 方法进行授权

我正在使用填充注册一列。

应用程序/Http/Controllers/ContactFormController.php
        public function update(Request $request, $id)
    {

        $contact = ContactForm::find($id);
        $this->authorize('update', $contact);        //authorizeを使用した認可
        $contact->fill([
                'name' => $request->your_name,
                'title' => $request->title,
                'email' => $request->email,
                'url' => $request->url,
                'gender' => $request->gender,
                'age' => $request->age,
                'contact' => $request->contact,
            ]);
            $contact->save();
            return redirect()
                ->route('contact.index');
    }


使用路由和中间件进行授权

Laravel 有中间件,允许您在提交的请求到达您的路由或控制器之前授权操作。在没有授权的情况下,中间件会生成并返回 403 屏幕作为 HTTP 响应。

路线/web.php
use App\Http\Controllers\ContactFormController;

Route::group(['middleware' => 'auth'], function () {
    Route::resource('contact', ContactFormController::class);

    Route::put('update/{id}/')                                    // ミドルウェアを使用した認可
        ->middleware('can:update' , ContactForm::class);
});

刀片模板授权

如果要在表单中设置授权,可以使用@can 和@cannot 隐藏表单本身。
需要在第一个参数中描述策略方法名称,并在第二个参数中匹配表单中描述的动作中描述的变量名和@can中描述的变量。

资源/视图/联系人/edit.blade.php
 <form method="POST" action="{{ route('contact.update', $contact->id)}}" accept-charset="UTF-8">
     @method('PUT')
     @csrf
     @can('update', $contact)        //← @canを使用した認可(action先と変数名を合わせる)
     <div>                                        
         <label for="">氏名
             <input type="text" placeholder="laravel" name="your_name" value="{{ $contact->name}}">
         </label>
         .
         .
         .
         <button>更新する</button>
     </div>
     @endcan 
 </form>

如果成功,您将无法编辑它,除了发布它的用户,如下所示。
除发帖用户外无编辑
Laravel 認可について
发帖用户可以编辑
Laravel 認可について

授权方式有几种,我会根据情况来设置。
策略方法也可以在各种条件下使用。感谢您观看到最后。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308622955.html

相关文章: