【发布时间】:2021-11-23 09:57:26
【问题描述】:
一段时间以来,我在 Laravel 中的网站一直存在问题。我有一个 Angular 前端,我正在使用 api 来查询特定用户的数据,以便特定用户可以在他的个人资料页面中更改他的数据。话虽如此,我显然不希望未经授权的人也能够访问其他个人资料页面来更改他们的数据。
例如:
在我的页面上,用户可以使用 URL .../user/1 查询他的数据。这样做的问题是:如果将.../user/1中的1更改为.../user/2,例如,该人可以访问id为2的人的数据。
我尝试了以下操作:
在我的api.php:
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
// Get Specific User
Route::get('user/{id}' ,'App\Http\Controllers\UserController@getUserById')->middleware('auth');
未经授权的用户无法再访问个人资料页面,但所有授权用户都可以访问所有其他用户并更改他们的数据。
我也尝试过:$id = Auth::id(),但这返回了我尝试在 null 上读取属性“id”
在我看来,这个问题相当复杂,因为我不知何故需要当前登录用户的 ID,并确保他们无法访问其他用户 ID。你知道我怎样才能最好地做到这一点吗?
我正在使用 Laravel 8
非常感谢!
编辑
谢谢你的详细解答,你给了我希望。我按照你的描述做了一切。
首先我使用php artisan make:middleware ResourceOwner 中间件创建并在protected $routeMiddleware 下的Kernel.php 中初始化它:'ResourceOwner' => \App\Http\Middleware\ResourceOwner::class, 并按照您描述的那样放入函数。
但不幸的是,我现在得到 401(未经授权),无论我通过什么 ID 以及我使用哪个用户登录。我试过了:
1. auth('api')->user();
2. $request->user('api');
3. Auth::guard('api')->user()
但它们都没有奏效。你知道我错过了什么吗? 我还注意到,当我删除您描述的功能时:
public function handle($request, Closure $next)
{
if ($request->id !== auth('api')->user->id) {
abort(403);
}
return $next($request);
}
我仍然收到同样的错误401(未经授权)。
但是当我对我的 JWT 进行编码时,我将 user_id 作为 ID 传递,这与它有什么关系吗?
但在我的数据库中,我的用户被声明为 id,例如:$table->id();。不幸的是,我仍然太缺乏经验,无法说出这是否与错误消息有关。我使用 Tymon/jwt-auth 包。
再次感谢您的时间和精力,我真的很感激。
【问题讨论】:
-
您是否使用护照进行身份验证?
-
不,实际上我使用的是 Tymon/jwt-auth 包。
-
1 - 从
kernel.php中删除ResourceOwner中间件,否则您明确表示必须在每个路由中使用它。 2 - 根据文档,您可以通过auth()->user()获取您的用户,所以我会尝试使用auth()->user()->id获取 id -
我刚刚删除了它,我收到以下错误:“目标类 [ResourceOwner] 不存在。 和 Unauthorized 错误。但是当我使用 Postman 我收到以下错误:** Route [login] not defined**。问题是否与此有关?
-
当我删除ResourceOwner.php里面的函数时,我仍然得到错误Unauthorized,所以我认为这个函数甚至不能被调用?但它仍然令人困惑,因为
->middleware(['auth', 'ResourceOwner']);是在我的路线之后定义的。
标签: angular laravel authentication jwt middleware