Laravel阻止用户访问其他用户资源** url

时间:2018-04-06 09:12:59

标签: laravel authentication laravel-5

我正在传递网址中的特定资源,例如。 https://www.example.com/ {companyID}

在控制器中,我可以通过

访问资源
public function index($companyID)
{
    // Code Here
}

我需要阻止用户更改网址并从系统中访问其他公司ID。目前它是公开的并且存在安全风险。我检查了Laravel Gate和Policy's但未能看到如何为我的案例实现这一点。

我真正想要的是AuthServiceProvider启动方法,可以在继续使用代码之前检查用户是否真的是资源的所有者。

任何帮助?

2 个答案:

答案 0 :(得分:3)

如前所述,您可以通过创建一个中间件来检查您的资源是否可供登录用户使用。

查看有关中间件here

的一些详细信息

首先,通过php artisan创建一个中间件,就像这样

php artisan make:middleware AuthResource

接下来,将其添加到您的App\Http\Kernel.php

protected $routeMiddleware = [
    ...
    'AuthResource' => \App\Http\Middleware\AuthResource::class,
];

在您的路线中,您现在可以执行以下操作:

Route::get('{companyID}', ['uses' => CompanyController@index, 'middleware' => 'AuthResource']);

这样,只要调用路由,就会使用AuthResource中间件。 在App\Http\Middleware\AuthResource.php中,您必须从

更改代码
public function handle($request, Closure $next)
{
    return $next($request);
}

检查资源是否可供当前登录用户使用。 我假设您的公司表有一个字段user_id,它将公司链接到用户。如果您的数据结构不同,则需要相应地更改代码。

public function handle($request, Closure $next)
{
    if ($request->route('companyID')) {
        $company = Company::find($request->route('companyID'));
        if ($company && $company->user_id != auth()->user()->id) {
            return redirect('/');
        }
    }

    return $next($request);
}

这样我们检查名称为companyID的路由参数是否存在,如果存在,我们检查当前登录用户是否可以使用。如果没有companyID参数可用,则可以不受任何限制地加载页面。

通过这种方式,您可以在中间件中复制/粘贴任何参数的代码,以便中间件可以为多个资源(不仅是公司)工作。

答案 1 :(得分:0)

这可以通过中间件轻松完成。但我会以更容易理解的方式做到这一点。 我假设您的用户与公司有一对一的关系。 所以首先建立关系, 在您的用户模型中,

Public function company() {
    return $this->hasOne(‘App\Company’);
}

公司模式

Public function user(){
   return $this->belongsTo(‘App\User’);
}

所以,现在通过运行php artisan make:auth进行Authenticate。有关Authenticate

的更多详情

现在在您的控制器中,

public function index($companyID)
{
    $current_user = Auth::user();
    $user_company = $current_user->company; // get the current user's company details
    If($companyID == $user_company->id){
        // do something
    }
}