#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. Ознакомьтесь здесь с практикой известных фреймворков и соглашениями об именах.