Авторизация / политика Laravel запрещает доступ для всех

#laravel #eloquent #laravel-authorization

Вопрос:

Я нашел похожее название и аналогичный задаваемый вопрос на этом веб-сайте, когда я исследовал, чтобы решить проблему. Но ни один из опубликованных ответов мне не помог. Этот вопрос может быть продублирован, но я не смог решить проблему, используя существующие вопросы в StackOverflow.
Я пытаюсь запретить доступ пользователям, которые не вошли в систему или не являются участниками модели «Школа»!
В «web.php» файл, который я использовал «промежуточное программное обеспечение(«аутентификация»)» для предотвращения доступа пользователей, которые не вошли в систему.
Теперь я создал «Политику» с именем «Школьная политика» для предотвращения доступа пользователей, которые не являются членами базы данных/модели «Школы».
Когда я вызываю метод «просмотр» из SchoolPolicy, он предотвращает доступ для всех авторизованных и неавторизованных пользователей!
Я также проверил и понял, что модель «Школа» возвращает «null», когда я пытаюсь поймать внешний ключ «user_id» из таблицы «школы».
Приведенный ниже фрагмент кода-это способ, которым я создал таблицу «Школы» с помощью миграции:

 Schema::create('schools', function (Blueprint $table) {
  $table->id();
  $table->foreignId('user_id')->constrained();
  $table->string('school_name');
  $table->string('school_address')->nullable();
  $table->string('school_email');
  $table->string('school_phone')->nullable();
  $table->string('url');
  $table->longText('descriptions')->nullable();
  $table->timestamps();
});
 

Это маршрут для просмотра любой школы, созданной любым пользователем (URL-адрес может быть динамическим).

 Route::group(['middleware' => 'auth'], function () {
 Route::get('/schools/{url}', [ViewSchool::class, 'index'])->name('yourschool.show');
});
 

И это «Школьная» модель. Я использовал php artisan make:model School команду для создания этой модели:

 <?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateSupportFacadesAuth;

class School extends Model{
  use HasFactory;

  /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
  protected $fillable = [
    'user_id',
    'school_name',
    'school_address',
    'school_email',
    'school_phone',
    'url',
    'descriptions'
  ];
}
 

In this section I created School Policy. However I used Laravel 8 but I also registered created Policy manually

  • SchoolPolicy
 <?php

namespace AppPolicies;

use AppModelsSchool;
use AppModelsUser;
use IlluminateAuthAccessHandlesAuthorization;

class SchoolPolicy
{
    use HandlesAuthorization;

    /**
     * Determine whether the user can view any models.
     *
     * @param  AppModelsUser  $user
     * @return mixed
     */
    public function viewAny(User $user)
    {
        //
    }

    /**
     * Determine whether the user can view the model.
     *
     * @param  AppModelsUser  $user
     * @param  AppModelsSchool  $school
     * @return mixed
     */
    public function view(User $user, School $school)
    {
        return $user->id == $school->user_id;
    }
}
 
  • In AuthServiceProvider.php I registered SchoolPolicy like this:
 <?php

namespace AppProviders;

use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;
use IlluminateSupportFacadesGate;
use AppModelsUser;
use AppModelsSchool;
use AppPoliciesSchoolPolicy;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        School::class => SchoolPolicy::class
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
    }
}
 
  • «ViewSchool.php» file where I want to use authorize method:
 <?php

namespace AppHttpControllersSchools;

use AppHttpControllersController;
use IlluminateHttpRequest;
use AppModelsUser;
use AppModelsSchool;
use IlluminateSupportFacadesDB;
use IlluminateSupportFacadesAuth;

class ViewSchool extends Controller
{
    public function index (School $school) {

        $this->authorize('view', $school);

        return view('layouts.viewschool');
    }
}
 

Я перепробовал множество способов решения этой проблемы, но ни один из них не сработал должным образом:

  • Первая попытка:
 public function index (School $school) {

 $this->authorize('view', $school);

}
 
  • Вторая попытка:
 public function index () {

  $this->authorize('view', School::class);

}
 
  • Я даже попытался распечатать любой вывод из школьной модели, но получил «ноль».:
 public function index (School $school) {

  dd($school->user_id);

}
 

Я следил за всеми учебниками на YouTube и официальном сайте Laravel, но в приведенных мною примерах авторизация работает неправильно.
Пожалуйста, помогите мне решить эту проблему.
Спасибо

Комментарии:

1. Добавьте свой маршрут в вопрос.

2. @Tpojka Я добавил коды для маршрута. Если в этом вопросе чего-то еще не хватает, пожалуйста, дайте мне знать

3. Вы используете «неявную привязку модели», и ваш параметр маршрута должен соответствовать имени объекта модели: /schools/{school} . Документы .

4. @Tpojka Да, в этом и была проблема. Большое вам спасибо за вашу помощь.

5. Ознакомьтесь здесь с практикой известных фреймворков и соглашениями об именах.