Php 拉威尔-唐';不允许用户访问其他用户数据

Php 拉威尔-唐';不允许用户访问其他用户数据,php,laravel,laravel-5.2,Php,Laravel,Laravel 5.2,在Laravel中,我们如何限制用户访问其他用户的数据 我需要在每个路由函数中写下代码吗?或者laravel是否提供了以中心为中心的方法?您可以创建并保护它不受某些用户(或来宾)的影响 要检查用户,请执行以下操作: public function updateProfile(Request $request) { if ($request->user()->id === 17) { // $request->user() returns an insta

在Laravel中,我们如何限制用户访问其他用户的数据

我需要在每个路由函数中写下代码吗?或者laravel是否提供了以中心为中心的方法?

您可以创建并保护它不受某些用户(或来宾)的影响

要检查用户,请执行以下操作:

public function updateProfile(Request $request)
{
    if ($request->user()->id === 17) {
        // $request->user() returns an instance of the authenticated user...
    }
}
但通常您希望使用一组用户:

if ($request->user()->isAdmin === true) {
或:

有关身份验证和保护数据的详细信息。

您可以创建并保护数据,使其免受某些用户(或来宾)的攻击

要检查用户,请执行以下操作:

public function updateProfile(Request $request)
{
    if ($request->user()->id === 17) {
        // $request->user() returns an instance of the authenticated user...
    }
}
但通常您希望使用一组用户:

if ($request->user()->isAdmin === true) {
或:


更多关于身份验证和保护数据的信息。

虽然我不知道您的使用案例,但假设您希望保护您的用户不被其他用户的配置文件看到。现在,如果您的显示用户路线类似

/users/{id}

然后创建一个中间件,比如说
myAuth

class MyAuth
{
  public function handle($request, Closure $next)
  {
    if(!auth()->check && !auth()->user()->id == request()->get('id'))
    {
      dd("you are not allowed to see this");
    }

    return $next($request);
  }
}
并将其包含在您的
Http/kernel.php

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'admin' => \App\Http\Middleware\Admin::class,
    //Your new middleware
    'myAuth' => \App\Http\Middleware\MyAuth::class,
];
并将您的路由包含在此中间件中

Route::group(['middleware' => 'myAuth'], function () {    
    Route::get('user/{id}', function () {
        //Only user with id 1 can see profile of user with id 1
    });
});

虽然我不知道您的用例,但假设您希望保护您的用户不被其他用户的配置文件看到。现在,如果您的显示用户路线类似

/users/{id}

然后创建一个中间件,比如说
myAuth

class MyAuth
{
  public function handle($request, Closure $next)
  {
    if(!auth()->check && !auth()->user()->id == request()->get('id'))
    {
      dd("you are not allowed to see this");
    }

    return $next($request);
  }
}
并将其包含在您的
Http/kernel.php

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'admin' => \App\Http\Middleware\Admin::class,
    //Your new middleware
    'myAuth' => \App\Http\Middleware\MyAuth::class,
];
并将您的路由包含在此中间件中

Route::group(['middleware' => 'myAuth'], function () {    
    Route::get('user/{id}', function () {
        //Only user with id 1 can see profile of user with id 1
    });
});

据我所知,最简单的方法是向模型中添加一个scope方法。这将在数据访问级别保护您。不过,更大的系统和复杂的数据结构需要更好的解决方案。创建中间件将提供更大的灵活性和报告潜在黑客的能力

public function scopeMy($query)
{
    $user = Auth::user();
    return $query->where('user_id', $user->id);
}
// usage
Article::where(...)->my()->get();

// you can pass arguments to method too
public function scopeMy($query, $user)
{
    return $query->where('user_id', $user->id);
}
// usage
Article::where(...)->my($user)->get();

据我所知,最简单的方法是向模型中添加一个scope方法。这将在数据访问级别保护您。不过,更大的系统和复杂的数据结构需要更好的解决方案。创建中间件将提供更大的灵活性和报告潜在黑客的能力

public function scopeMy($query)
{
    $user = Auth::user();
    return $query->where('user_id', $user->id);
}
// usage
Article::where(...)->my()->get();

// you can pass arguments to method too
public function scopeMy($query, $user)
{
    return $query->where('user_id', $user->id);
}
// usage
Article::where(...)->my($user)->get();

Laravel的内置功能“策略”似乎是一个更好、更干净的解决方案。请参阅,正如@techfoobar所建议的那样,.

Laravel的内置功能“策略”似乎是一个更好、更干净的解决方案。请参考@techfoobar的建议,.

可能会有所帮助:取决于我想象的情况。您可以使用当前经过身份验证的用户ID进行查询,仅获取他们的信息Might help:取决于我想象的情况。您可以使用当前经过身份验证的用户ID进行查询,仅获取其信息。这不会回答“如何限制一个用户访问其他用户的数据”。我已更新了答案,并尝试给出更多示例。这不会回答“如何限制一个用户访问其他用户的数据”.我更新了我的答案,并尝试给出更多的例子。