Php 拉威尔-唐';不允许用户访问其他用户数据
在Laravel中,我们如何限制用户访问其他用户的数据 我需要在每个路由函数中写下代码吗?或者laravel是否提供了以中心为中心的方法?您可以创建并保护它不受某些用户(或来宾)的影响 要检查用户,请执行以下操作: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
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进行查询,仅获取其信息。这不会回答“如何限制一个用户访问其他用户的数据”。我已更新了答案,并尝试给出更多示例。这不会回答“如何限制一个用户访问其他用户的数据”.我更新了我的答案,并尝试给出更多的例子。