在我的Laravel应用程序中,可以将管理员分配给工作,我也有可以执行所有操作的超级管理员。
不是超级管理员的管理员只能访问分配给他们的作业。
让我们用粗略的路线进行说明:
// mymodule.js
module.exports = {
foo: function (page) {
return page.evaluateOnNewDocument(async () => {
await page.goto('http://www.google.com');
await page.waitFor(10000);
});
}
};
http://localhost:3000/jobs/{job}
在这种情况下,http://localhost:3000/jobs/{job}/notes{note}
是通过路由模型绑定获取的ID,并且注释附加到作业上。
分配给作业的管理员是通过以下关系方法完成的:
{job}
所以我可以使用/**
* Get the jobs that this admin has access to via the pivot table
*
* @return void
*/
public function jobs()
{
return $this->belongsToMany(JobPost::class, 'job_post_admin', 'admin_id', 'job_post_id');
}
我要说的是-如果您是超级管理员,则可以去任何地方,如果您不在,则应仅限于分配给您的内容。
因此,如果用户仅有权访问$user->jobs
,而他们访问了http://localhost:3000/jobs/{1}
,则应将其重定向。
我创建了一个名为Access的中间件
http://localhost:3000/jobs/{2}
但是,我对如何从URL获取作业ID感到困惑。
我有一个工作的MiddleWare,看起来像这样:
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::guard('admin')->user()) {
$user = Auth::guard('admin')->user();
if ($user->is_admin) {
return $next($request);
} else {
if ($user->jobs->contains($job)) {
return $next($request);
} else {
return response('You do not have sufficient priveledges to perform this action.', 403);
}
}
} else {
return redirect()->back();
}
}
但是我现在很感兴趣,因为听起来不那么密集,我还没有真正承认Laravel中的授权,它比中间件有好处吗?
答案 0 :(得分:2)
身份验证与授权不同。 Laravel都支持。
您可以使用授权策略执行所需的操作,无需额外的中间件。
首先创建一个策略:
php artisan make:policy JobsPolicy --model=Job
这将使您的样板。然后,您可以添加操作:
class JobsPolicy {
use HandlesAuthorization;
//If you return true here the policy always succeeds
public function before(User $user, $ability) {
if ($user->is_admin) {
return true;
}
}
public function view(User $user, Job $job) {
return $user->jobs->contains($job);
}
public function create(User $user) {
return true; //Return true if the user can create jobs
}
public function update(User $user, Job $job) {
return $user->jobs->contains($job);
}
}
您还需要在AuthServiceProvider
数组的$policies
中注册策略:
protected $policies = [
Job::class => JobPolicy::class
];
然后,您可以添加已经存在的中间件,例如:
Routes::get('jobs/{job}/notes/{note}', ...)->middleware("can:view,job");
这将确保路由作业参数指定的当前已认证用户can
view
job
。