Laravel - 不允许用户访问其他用户数据

时间:2016-05-05 07:31:13

标签: php laravel laravel-5.2

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

我是否需要在每个路由功能中写下代码?或laravel是否提供中心方法?

4 个答案:

答案 0 :(得分:6)

虽然我不了解您的用例,但我们假设您希望保护您的用户免于查看其他用户的个人资料。现在,如果您的节目用户路线类似于

/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
    });
});

答案 1 :(得分:2)

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

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();

答案 2 :(得分:0)

您可以创建route group并保护其免受某些用户(或访客)的侵害。

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function ()    {
        // Uses Auth Middleware
    });

    Route::get('user/profile', function () {
        // Uses Auth Middleware
    });
});

要检查用户是否执行以下操作:

public function updateProfile(Request $request)
{
    if ($request->user()->id === 17) {
        // $request->user() returns an instance of the authenticated user...
    }
}

但通常你想要使用一组用户:

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

或者:

if (Auth::user->isAdmin === true) {

有关身份验证和保护数据的更多信息here

答案 3 :(得分:0)

Laravel的内置功能" 政策"似乎是一个更好,更清洁的解决方案。请参阅laravel docs on authorization,并按照@techfoobar的建议,this