【问题标题】:How to validate data, protect routes, authorize routes/actions in Laravel 8如何在 Laravel 8 中验证数据、保护路由、授权路由/动作
【发布时间】:2021-10-25 01:17:15
【问题描述】:

这会是一个有点长的问题,我正在完成我的申请,但在结束之前还有一些事情要做。

起初:我做了一些 POST 表单/功能。它们运行良好,但如果我不传递其中一个 $request 数据,它带有 SQL 错误,我读到它来管理我需要验证,所以我用验证规则制作了 Request 模型,但我不知道如何实现它进入我的控制器类。

这看起来像我的请求模型并在控制器内部创建类:

public function create(Request $request)
    {
        $id = Auth::id();
        $event = new Event;
        $event->name = $request->name;
        $event->description = $request->description;
        $event->address = $request->address;
        $event->date_of_event = $request->date_of_event;
        $event->displayed = 0;
        $event->photo_patch = $request->photo_patch->store('images','public');
        $event->club_id = $request->club_id;
        $event->user_id = $id;
        $event->save();

        return redirect('events');
    }
------------Request---------------------------
return [
            'name' => 'required|max:50',
            'description' => 'required|max:100',
            'address' => 'required|max:63',
            'date_of_event' =>'required',
            'photo_patch' =>'required',
            'club_id' =>'required',
        ];

要保护的第二件事是为管理员和用户拆分视图,因为我通过 Gate(admin-level) 使用 db admin(boolean) 中的列进行了授权

我正在考虑像这样进行验证:

public function index()
{
    $id = Auth::id();
    if (Gate::authorize('admin-level')){
        $events = Event::get();
    }
    else{
        $events = Event::where('user_id',$id)->get();
    }  
    return view('backend/event/index', ['events' => $events]);
}

但随后出现错误:

Non static method 'authorize' should not be called statically.

有没有办法绕过它?或者,有没有更好/更简单的授权方式?

我的第三个问题是保护用户免受其他用户的更改。

这是什么意思。

每个用户只能访问他自己的俱乐部/活动,但如果有人将 url 例如其他 ID,他可以编辑他想要的每个俱乐部/活动。我该如何预防?

我的最后一个问题 我正在使用中间件身份验证来保护我的路由,有没有更好的方法来做到这一点?

Route::middleware(['auth'])->group(function() {

提前感谢您的回答。

【问题讨论】:

  • 一问三问,让问题变得非常复杂。这可能意味着您的问题将来不会得到回答,因为您有点要求人们回答所有 3 个问题。
  • @mrhn 我必须在 stackoverflow 上发送 3 个问题,这可能需要我 3 个小时,因为您可以每 90 分钟问一次。
  • 我明白了,但仍然认为将其组合在一起更合乎逻辑。因为 stackoverflow 也适用于下一个面临相同问题的人,并且将问题分组在一起使得索引变得更加困难。同时,stackoverflow 也希望是二进制的,应该有一个可以说是最好的答案,而不是固执己见,你输入的问题越多,答案就会越模糊。只是一个想法,对于这个很好:)

标签: php laravel laravel-8


【解决方案1】:

你的门应该被召唤在门面上,我不相信你正在这样做。请使用以下门类。

use Illuminate\Support\Facades\Gate;

Validation 可以通过在您的请求对象上调用 validate() 来实现。如果失败,这也会自动抛出异常。

$validated = $request->validate([
    'name' => 'required|max:50',
    'description' => 'required|max:100',
    'address' => 'required|max:63',
    'date_of_event' =>'required',
    'photo_patch' =>'required',
    'club_id' =>'required',
]);

禁止用户编辑俱乐部。通常,您可以使用策略或查询来控制对对象的访问。这是一个策略示例。

public function find(Club $club) {
    $this->authorize('view', $club);
}

class ClubPolicy {
    public function view(User $user, Club $club)
    {
        return $club->user_id === $user->id;
    }
}

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 2018-06-30
    • 2014-07-18
    • 2021-02-22
    • 1970-01-01
    • 2017-02-11
    • 2016-02-11
    • 2019-09-13
    • 2023-03-28
    相关资源
    最近更新 更多