验证控制器内部的用户访问权限

时间:2018-10-30 18:48:07

标签: php laravel

我刚刚开始学习Laravel 5.7,想知道是否有一种更简便的方法来验证特定用户是否有权编辑,删除或查看页面。

场景

用户有很多公司,可以查看,编辑和删除它们。因此,如果他们尝试访问不属于的公司名称(id),则会获得“访问权限”或其他内容。我的问题是,我不断重复我的代码,而且看起来效率很低。

示例代码

public function edit($id)
{

    // Check if the company ID exists
    if(!Company::whereId($id)->first() || !Company::whereId($id)->where('user_group',Auth::user()->user_group)->first())
    {
        return abort(404);
    }

    return view('company/edit');

}

因此,在我的示例中,我检查公司的ID是否存在,以及公司和user_group是否具有相同的ID。但是,我需要为“ show”方法和具有相同场景的任何其他方法(包括其他控制器)重复此代码。

如何使我的生活更轻松?最佳做法是什么?一个例子会很好。

3 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,我相信解决您问题的最佳方法是使用policies。策略可以看作是用户和模型(在您的情况下为公司)之间的链接。您可以指定创建,显示,更新和删除方法,并指定用户是否应该能够执行特定操作。

策略通过其常规用法而引人注目,您不必检查用户是否可以在代码中的其他任何位置查看特定公司,只需一次,而Eloquent则负责其余部分。

答案 1 :(得分:0)

干净的方法是使用Laravel Validator

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

        if ($validator->fails()) {
            return redirect('post/create')
                        ->withErrors($validator)
                        ->withInput();
        }

        // Store the blog post...
    }

答案 2 :(得分:0)

我们通过中间件来做到这一点。您可以在数据库上创建用户访问表,并制作一个中间件来检查用户是否具有访问权限。然后允许访问是否存在于表上,如果没有则重定向。但是,这种方法仅适用于用户类型级别,不适用于特定用户。