在Laravel中,我们如何限制用户访问其他用户的数据?
我是否需要在每个路由功能中写下代码?或laravel是否提供中心方法?
答案 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。