Вызов неопределенного метода «Осветить \\ База данных \\ Запрос \\ Builder :: can ()» - PullRequest
0 голосов
/ 16 ноября 2018

Невозможно найти ответы в любом месте

Я использую политику Laravel 5.5, чтобы ограничить пользователя от перечисления свойств, которые не зарегистрированы пользователем (аутентифицированы через API). У меня есть два класса User и HostProperty. Кроме того, я зарегистрировал политику для пользователя, чтобы получить доступ к своему списку размещенных свойств по ID.

Вот мои модели.

Главная проблема не может вызвать метод контроллера - который выдает ошибку выше:

$authUser = auth('api')->user();
if ($authUser->can('access', $property)) {
              return response()->json(['success' => 'success']); 
            } else {
              return response()->json(['error' => 'error']); 
            }

User.php

namespace App;

use Illuminate\Notifications\Notifiable;
use Cartalyst\Sentinel\Users\EloquentUser;
use Illuminate\Database\Eloquent\SoftDeletes;
use Laravel\Passport\HasApiTokens;
use Illuminate\Auth\Authenticatable as AuthenticableTrait;
use Illuminate\Contracts\Auth\Authenticatable;

class User extends EloquentUser implements Authenticatable
{
    use HasApiTokens, Notifiable;
    use SoftDeletes;
    use AuthenticableTrait;
    protected $guarded=[];
    protected $dates = ['deleted_at'];
    protected $hidden = [
        'password', 'remember_token',
    ];

    //hosts relation
    public function hostproperty()
    {
        return $this->hasMany('App\Models\Hosts\HostProperty','user_id');
    }
}

HostProperty.php

namespace App\Models\Hosts;

use Illuminate\Database\Eloquent\Model;

class HostProperty extends Model
{
    public $timestamps = true;
    protected $guarded=[];
    protected $hidden = [
        'user_id',
    ];
    public function user()
    {
        return $this->belongsTo('App\User','user_id');
    }
}

HostPropertyPolicy

namespace App\Policies\Host;

use App\User;
use App\Models\Hosts\HostProperty; 
use Illuminate\Auth\Access\HandlesAuthorization;

class HostPropertyPolicy
{
    use HandlesAuthorization;

    /**
     * Create a new policy instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    public function access(User $user, HostProperty $HostProperty)
    {return TRUE;
        //return $user->id === $HostProperty->user_id;
    }
}

AuthServiceProvider

namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use App\Models\Hosts\HostProperty;
use App\Policies\Host\HostPropertyPolicy;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
        HostProperty::class=>HostPropertyPolicy::class,
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
         Passport::routes();

    }
}

HostPropertyController

    use App\User;
    use App\Models\Hosts\HostProperty; 
    use App\Http\Controllers\Controller;
class HostPropertyController extends Controller
{
    public function listOneProperty($propertyId)
        {
            $authUser = auth('api')->user();
            $property=HostProperty::with('user')->find($propertyId);
            if ($authUser->can('access', $property)) {
              return response()->json(['success' => 'success']); 
            } else {
              return response()->json(['error' => 'error']); 
            }
    }

}

Маршрут

Route::get('listOneProperty/{propertyId}',  array('as' => 'listOneProperty.get', 'uses' => 'HostPropertyController@listOneProperty'));

Обратите внимание: я звоню из API - вышеупомянутый маршрут для API, я не могу использовать политику для маршрутов API. Я продолжаю получать вышеуказанную ошибку при вызове этого маршрута.

Я пытался

$this->authorize('access', $property);

Однако, поскольку API не хранит сеанс входа в систему, вышеописанное не может быть завершено, поэтому я снова попытался с

$authUser = auth('api')->user();
$authUser->authorize('access', $property);

тоже не работает. Я перепробовал все, что мог, но все же, я не могу сделать это правильно.

Если у кого-то есть пример использования политики Laravel в API, аутентифицируемый Passport, было бы полезно для любого, кто хочет сделать это правильно.

С уважением

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Однако, поскольку API не хранит сеанс входа в систему, вышеописанное не может быть завершено, поэтому я снова попытался с

Аутентификация обычно обрабатывается промежуточным ПО в Laravel.Если вы используете Passport, вы сможете использовать промежуточное программное обеспечение auth:api для аутентификации запросов, если вы отправляете правильный заголовок авторизации и токен.

Попробуйте изменить это

$authUser = auth('api')->user();

к этому

$authUser = auth()->user();

И добавьте промежуточное программное обеспечение для аутентификации в свой маршрут:

Route::get('listOneProperty/{propertyId}', 'HostPropertyController@listOneProperty')
     ->name('listOneProperty.get')
     ->middleware('auth:api');

Если вы используете API из ваших собственных веб-представлений и вычтобы он работал с текущим сеансом, ознакомьтесь с разделом Использование вашего API с JavaScript документа Passport: https://laravel.com/docs/5.7/passport#consuming-your-api-with-javascript

0 голосов
/ 16 ноября 2018

выглядит как

$authUser = auth('api')->user();

возвращает запрос вместо User модели.

Пожалуйста, убедитесь, что $authUser является моделью пользователя, прежде чем звонить ->can()

...