Я разрабатываю приложение с Laravel, я понял, что можно сделать с Policy
точно может быть сделано с Middleware
, Скажем, я хочу запретить пользователю обновлять маршрут, если он / она не является владельцем информации, я могу легко проверить маршрут и сделать то же самое из политики.
Итак, мой вопрос, почему я должен использовать policy
через промежуточное ПО и наоборот
В настоящее время я прошёл небольшой рефакторинг со своими ролями, разрешениями и маршрутами и задал себе тот же вопрос.
На поверхностном уровне кажется, что настоящее промежуточное ПО и политики выполняют одну и ту же общую идею. Проверьте, может ли пользователь делать то, что он делает.
Для справки вот документы по Laravel …
Промежуточное
«Могу ли я увидеть это? Могу ли я пойти сюда?»
Промежуточное ПО HTTP обеспечивает удобный механизм фильтрации HTTP.
запросы, поступающие в ваше приложение. Например, Laravel включает в себя
промежуточное ПО, которое проверяет пользователя вашего приложения
проверку подлинности. Если пользователь не аутентифицирован, промежуточное ПО будет
перенаправить пользователя на экран входа в систему. Однако, если пользователь
После проверки подлинности промежуточное программное обеспечение разрешит выполнение запроса.
дальше в приложение.Конечно, дополнительное промежуточное программное обеспечение может быть написано для выполнения разнообразных
задач помимо аутентификации. Промежуточное программное обеспечение CORS может быть
отвечает за добавление правильных заголовков ко всем ответам, оставляя
ваше приложение. Промежуточное программное обеспечение может регистрировать все входящие запросы
к вашему заявлению.
https://laravel.com/docs/master/middleware#introduction
В моем чтении, Middleware — это работа на уровне запросов. В терминах «Может ли этот пользователь увидеть страницу? «или» Может ли этот пользователь что-то сделать здесь? »
Если это так, он переходит к методу контроллера, связанному с этой страницей. Интересно, что Middleware может сказать: «Да, вы можете пойти туда, но я запишу, что вы идете». И т.п.
Как только это будет сделано. Он больше не контролирует и не говорит о том, что делает пользователь. Другой способ, которым я думаю об этом как о посреднике.
полисы
«Могу ли я сделать это? Могу ли я изменить это?»
В дополнение к предоставлению услуг аутентификации из коробки,
Laravel также предоставляет простой способ организации логики авторизации и
контролировать доступ к ресурсам. Есть множество методов и
помощники, которые помогут вам в организации логики авторизации, и
мы рассмотрим каждый из них в этом документе.
https://laravel.com/docs/master/authorization#introduction
Тем не менее, политика, как представляется, больше касается дела. Может ли пользователь обновить какую-либо запись или только свою?
Эти вопросы кажутся подходящими для метода контроллера, где все призывы к действию на ресурсе организованы. Получить этот объект, сохранить или обновить статью.
Как упомянутый тджбб, промежуточное ПО может сделать маршруты очень грязными и сложными в управлении. Это пример из моего файла маршрутов:
Эта проблема
Route::group(['middleware' =>'role:person_type,person_type2',], function () {
Route::get('download-thing/{thing}', [
'as' => 'download-thing',
'uses' => 'ThingController@download'
]);
});
Это очень трудно прочитать в моем файле маршрута!
Другой подход с политикой
//ThingController
public function download(Thing $thing)
{
//Policy method and controller method match, no need to name it
$this->authorize($thing);
//download logic here....
}
Промежуточное программное обеспечение маршрутов позволяет применять обработку запросов к большому диапазону маршрутов, вместо того, чтобы повторять код в каждом действии контроллера — хороший пример — проверка аутентификации и перенаправление гостей. Контроллеры вместо этого содержат логику, уникальную для конкретных маршрутов / действий — вы можете использовать промежуточное программное обеспечение для этого, но вам потребуется отдельное промежуточное программное обеспечение для логики каждого маршрута, и все это будет очень запутанным.
Политики / возможности — это просто способ проверки прав пользователей — вы можете запрашивать их с контроллера, промежуточного программного обеспечения или где-либо еще. Они только возвращают true или false, поэтому они не эквивалентны контроллерам или промежуточному программному обеспечению. В большинстве случаев возможности будут сравнивать пользователя с другой моделью, которая будет загружена на основе идентификатора, отправленного в действие контроллера, но, вероятно, есть и некоторые приложения для использования с промежуточным ПО.