基于关系的Laravel中间件

时间:2018-10-05 14:54:02

标签: php laravel

在我的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中的授权,它比中间件有好处吗?

1 个答案:

答案 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

documentation

中有更多信息