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

Laravel LAVEL阻止用户访问其他用户资源**url,laravel,authentication,laravel-5,Laravel,Authentication,Laravel 5,我正在传递url中的特定资源,例如。 {companyID} 在控制器中,我可以通过 public function index($companyID) { // Code Here } 我需要阻止用户更改url和从系统访问其他公司ID。目前它是开放的,是一种安全风险。我查看了Laravel Gate和Policy的,但没有看到如何在我的案例中实现这一点 我真正想要的是AuthServiceProvider引导方法中的一些东西,它可以在继续代码之前检查用户是否真的是资源的所有者 有什么

我正在传递url中的特定资源,例如。 {companyID}

在控制器中,我可以通过

public function index($companyID)
{
    // Code Here
}
我需要阻止用户更改url和从系统访问其他公司ID。目前它是开放的,是一种安全风险。我查看了Laravel Gate和Policy的,但没有看到如何在我的案例中实现这一点

我真正想要的是AuthServiceProvider引导方法中的一些东西,它可以在继续代码之前检查用户是否真的是资源的所有者


有什么帮助吗?

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

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

Public function user(){
   return $this->belongsTo(‘App\User’);
}
现在,通过运行php artisan make:auth进行身份验证。更多详情

现在在你的控制器里

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
    }
}

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

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

Public function user(){
   return $this->belongsTo(‘App\User’);
}
现在,通过运行php artisan make:auth进行身份验证。更多详情

现在在你的控制器里

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
    }
}

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

请参阅有关中间件的一些详细信息

首先,通过php artisan创建一个中间件,如下所示

php artisan make:middleware AuthResource
接下来,将其添加到App\Http\Kernel.php中

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

Route::get('{companyID}', ['uses' => CompanyController@index, 'middleware' => 'AuthResource']);
这样,无论调用哪个路由,都将使用AuthResource中间件。 在您的App\Http\Middleware\AuthResource.php中,您必须从

public function handle($request, Closure $next)
{
    return $next($request);
}
检查资源是否可供当前登录用户使用的内容。 我假设您的companys表有一个字段user\u 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参数,则可以不受任何限制地加载页面


通过这种方式,您可以在中间件中复制/粘贴任何参数的代码,以便中间件不仅适用于公司,而且适用于多个资源。

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

请参阅有关中间件的一些详细信息

首先,通过php artisan创建一个中间件,如下所示

php artisan make:middleware AuthResource
接下来,将其添加到App\Http\Kernel.php中

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

Route::get('{companyID}', ['uses' => CompanyController@index, 'middleware' => 'AuthResource']);
这样,无论调用哪个路由,都将使用AuthResource中间件。 在您的App\Http\Middleware\AuthResource.php中,您必须从

public function handle($request, Closure $next)
{
    return $next($request);
}
检查资源是否可供当前登录用户使用的内容。 我假设您的companys表有一个字段user\u 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参数,则可以不受任何限制地加载页面


这样,您就可以在中间件中复制/粘贴任何参数的代码,这样中间件就可以为多个资源而不仅仅是公司工作。

使用中间件只允许用户访问其公司ID登录的用户与公司有何关联?如果你用数据库结构编辑你的问题,我可以给你一个答案:-如果你可以粘贴你的公司模型,这会有很大帮助,我也可以为你提供答案。你知道如何在controller中获取当前用户详细信息,或者你已经启用了身份验证吗?使用中间件只允许用户访问其公司ID的权限登录的用户与公司的关系如何?如果你用数据库结构编辑你的问题,我可以给你一个答案:-如果你能粘贴你的公司模型,这会有很大帮助,我也能给你一个答案。你知道如何在controller中获取当前用户的详细信息,或者你已经启用了身份验证吗?鉴于你的更详细比我的更详细,我删除了我的:-记住,我们只能假设公司是模型名称,用户的可填写名称相同。如果你的比我的更详细,我删除了我的:-记住,我们只能假设公司是模型名称,用户的可填写名称相同。谢谢,但这需要在所有函数上都显示此代码,这可能会导致SOM问题
沿着这条路再往前走。Matthias解决方案允许使用一个代码来管理所有函数。谢谢,但这需要在所有函数上都显示此代码,这可能会很麻烦。Matthias解决方案允许一个代码来管理所有代码。