我刚刚开始学习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”方法和具有相同场景的任何其他方法(包括其他控制器)重复此代码。
如何使我的生活更轻松?最佳做法是什么?一个例子会很好。
答案 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)
我们通过中间件来做到这一点。您可以在数据库上创建用户访问表,并制作一个中间件来检查用户是否具有访问权限。然后允许访问是否存在于表上,如果没有则重定向。但是,这种方法仅适用于用户类型级别,不适用于特定用户。