UserResource Auth Null в результате запроса для запроса неаутентифицированного пользователяPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 UserResource Auth Null в результате запроса для запроса неаутентифицированного пользователя

Сообщение Anonymous »

Я работаю над проектом API Laravel 11 с интерфейсом Nuxt. А также мы используем Passport для аутентификации и авторизации. У меня проблемы с пользователями. Допустим, есть только 2 пользователя, как показано ниже:

Код: Выделить всё

[
[
'first_name'    => 'John',
'last_name'     => 'Doe',
'email'         => 'johndoe@example.com',
'country_id'    => 1,
'phone'         => '1112222222',
'isAdmin'       => true,
'password'      => Hash::make(Str::password(32, true, true, true, false))
],
[
'first_name'    => 'Bob',
'last_name'     => 'Carlo',
'email'         => 'bobcarlo@example.com',
'country_id'    => 1,
'phone'         => '111111111',
'isAdmin'       => true,
'password'      => Hash::make(Str::password(32, true, true, true, false)),
'email_send_at' => null,
'phone_send_at' => null
],
];
Предположим, я аутентифицирован как Боб. Я сохранил жетон носителя для Почтальона. А затем предположим, что если я отправлю запрос GET для фильтрации пользователей, скажем, их полное имя со строкой запроса «Боб», я получу правильный результат, который является всего лишь вторым пользователем. А затем, допустим, я отправляю еще один запрос GET только с «o», и оба они возвращаются, что тоже правильно. Но если отправить запрос только с «J» или любым значением строки запроса, которое вернет другому пользователю, я не получу желаемый результат. Аутентификация не удалась. Это не только для FullName. Та же проблема существует и для других полей. Допустим, я отправлю запрос со строкой телефонного запроса. если я отправлю «1», результат должен быть обоим, и это так. Но если я отправлю «2», это просто не будет работать так, как я хотел.
Во-первых, вот маршруты api.php:

Код: Выделить всё

// User Routes - Start
Route::prefix('user')->group(function ()
Route::group([
"middleware" => ["auth:api"]
], function () {
Route::post('/', [UserController::class, 'store'])->middleware('can:publish user');
Route::put('/{user}', [UserController::class, 'update'])->middleware('can:update user');
Route::delete('/{user}', [UserController::class, 'destroy'])->middleware('can:destroy user');
Route::delete('/', [UserController::class, 'destroyMultiple'])->middleware('can:destroy user');
});

Route::group([
"middleware" => ["client"]
], function () {
Route::get('/', [UserController::class, 'index']);
Route::get('/{user}', [UserController::class, 'show']);
});

});
// User Routes - End
Мы используем глобальную область видимости для применения поиска и фильтров к моделям. Вот модель пользователя:

Код: Выделить всё

class User extends Authenticatable
{
use HasFactory, Notifiable, HasRoles, HasApiTokens;

protected static function boot()
{
parent::boot();

static::addGlobalScope(new FilterBy('App\Services\V1\User\UserFilters', request()->all()));
}

//......
Вот FilterBy Область действия:

Код: Выделить всё

class FilterBy implements Scope
{

protected $namespace;
protected $filters;

public function __construct($namespace, $filters)
{
$this->namespace = $namespace;
$this->filters = $filters;
}
/**
* Apply the scope to a given Eloquent query builder.
*/
public function apply(Builder $builder, Model $model): void
{
if (request()->method() !== 'GET' || empty($this->filters)) {
return;
}

$filter = new FilterBuilder($builder, $this->filters, $this->namespace);
$builder = $filter->apply();
}
}
А также класс FilterBuilder:

Код: Выделить всё

class FilterBy implements Scope
{

protected $namespace;
protected $filters;

public function __construct($namespace, $filters)
{
$this->namespace = $namespace;
$this->filters = $filters;
}
/**
* Apply the scope to a given Eloquent query builder.
*/
public function apply(Builder $builder, Model $model): void
{
if (request()->method() !== 'GET' || empty($this->filters)) {
return;
}

$filter = new FilterBuilder($builder, $this->filters, $this->namespace);
$builder = $filter->apply();
}
}
По сути, у меня есть каталог User с классами, которые фактически добавляют фильтры к запросу. Например, вот FullName.php:

Код: Выделить всё

class FullName extends QueryFilter implements FilterContract
{
protected $query;

public function __construct($query)
{
$this->query = $query;
}

public function handle($value = ""): void
{
$this->query->where(DB::raw("CONCAT(first_name, ' ', last_name)"), 'ilike', '%' . $value . '%');
}
}
Вот метод контроллера:

Код: Выделить всё

public function index(Request $request)
{
return new UserCollection(User::paginate($request->get('perPage', 15)));
}
Также здесь находятся UserCollection и UserResource:

Код: Выделить всё

class UserCollection extends ResourceCollection
{
public function __construct($resource)
{
parent::__construct($resource);

$this->preserveAllQueryParameters = true;
}

public function toArray(Request $request): array
{
return parent::toArray($request);
}
}

Код: Выделить всё

class UserResource extends JsonResource
{
public function toArray(Request $request): array
{
if (Auth::check() && Auth::user()->isAdmin && Auth::user()->can('show user')) {
return [
'id' => $this->id,
'first_name' => $this->first_name,
'last_name' => $this->last_name,
'email' => $this->email,
'country_id' => $this->country_id,
'phone' => $this->phone,
'isAdmin' => $this->isAdmin,
];
}

return [
'first_name' => $this->first_name,
'last_name' => $this->last_name,
'country_id' => $this->country_id,
];
}
}
Итак, как я уже упоминал, если я отправлю запрос со строкой запроса, которая вернет ТОЛЬКО одного пользователя, который в настоящее время не прошел аутентификацию, он вернет только имя, фамилию и идентификатор страны. Я использовал dd(Auth::user()) в индексном методе UserController. Если я отправлю запрос, который вызовет упомянутую мной проблему, он будет «нулевым», если я отправлю запрос, который вернет обоих пользователей, он не будет нулевым.

Подробнее здесь: https://stackoverflow.com/questions/786 ... er-request
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»