Ограничение доступа определенного пользователя к POST, DELETE, PATCH, PUT

avatar
SNaRe
8 апреля 2018 в 12:00
782
1
2

У меня установлен Laravel 5.6.

Я хочу предоставить демо-аккаунт пользователю, который не может ничего ВСТАВЛЯТЬ или ОБНОВЛЯТЬ, кроме как просматривать все.

В моей системе нет группы ролей. Я просто хочу где-то жестко закодировать идентификатор пользователя и ограничить эти действия.

Я погуглил и нашел много разных подходов ( https://laracasts.com/discuss/channels/laravel/protecting-route-for-specific-user ), что намного больше, чем то, что Я нуждаюсь. Я просто хочу ограничить эти функции определенными пользователями на всем веб-сайте.

Domain | Method    | URI                                                   | Name                            | Action                                                                             | Middleware                                       |
+--------+-----------+-------------------------------------------------------+---------------------------------+------------------------------------------------------------------------------------+--------------------------------------------------+
|        | GET|HEAD  | /                                                     |                                 | Closure                                                                            | web                                              |
|        | GET|HEAD  | _debugbar/assets/javascript                           | debugbar.assets.js              | Barryvdh\Debugbar\Controllers\AssetController@js                                   | Barryvdh\Debugbar\Middleware\DebugbarEnabled     |
|        | GET|HEAD  | _debugbar/assets/stylesheets                          | debugbar.assets.css             | Barryvdh\Debugbar\Controllers\AssetController@css                                  | Barryvdh\Debugbar\Middleware\DebugbarEnabled     |
|        | DELETE    | _debugbar/cache/{key}/{tags?}                         | debugbar.cache.delete           | Barryvdh\Debugbar\Controllers\CacheController@delete                               | Barryvdh\Debugbar\Middleware\DebugbarEnabled     |
|        | GET|HEAD  | _debugbar/clockwork/{id}                              | debugbar.clockwork              | Barryvdh\Debugbar\Controllers\OpenHandlerController@clockwork                      | Barryvdh\Debugbar\Middleware\DebugbarEnabled     |
|        | GET|HEAD  | _debugbar/open                                        | debugbar.openhandler            | Barryvdh\Debugbar\Controllers\OpenHandlerController@handle                         | Barryvdh\Debugbar\Middleware\DebugbarEnabled     |
|        | GET|HEAD  | api/user                                              |                                 | Closure                                                                            | api,auth:api                                     |
|        | GET|HEAD  | giris                                                 |                                 | Closure                                                                            | web                                              |
|        | GET|HEAD  | horizon/api/jobs/failed                               | horizon.failed-jobs.index       | Laravel\Horizon\Http\Controllers\FailedJobsController@index                        | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/jobs/failed/{id}                          | horizon.failed-jobs.show        | Laravel\Horizon\Http\Controllers\FailedJobsController@show                         | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/jobs/recent                               | horizon.recent-jobs.index       | Laravel\Horizon\Http\Controllers\RecentJobsController@index                        | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | POST      | horizon/api/jobs/retry/{id}                           | horizon.retry-jobs.show         | Laravel\Horizon\Http\Controllers\RetryController@store                             | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/masters                                   | horizon.masters.index           | Laravel\Horizon\Http\Controllers\MasterSupervisorController@index                  | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/metrics/jobs                              | horizon.jobs-metrics.index      | Laravel\Horizon\Http\Controllers\JobMetricsController@index                        | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/metrics/jobs/{id}                         | horizon.jobs-metrics.show       | Laravel\Horizon\Http\Controllers\JobMetricsController@show                         | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/metrics/queues                            | horizon.queues-metrics.index    | Laravel\Horizon\Http\Controllers\QueueMetricsController@index                      | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/metrics/queues/{id}                       | horizon.queues-metrics.show     | Laravel\Horizon\Http\Controllers\QueueMetricsController@show                       | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | POST      | horizon/api/monitoring                                | horizon.monitoring.store        | Laravel\Horizon\Http\Controllers\MonitoringController@store                        | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/monitoring                                | horizon.monitoring.index        | Laravel\Horizon\Http\Controllers\MonitoringController@index                        | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/monitoring/{tag}                          | horizon.monitoring-tag.paginate | Laravel\Horizon\Http\Controllers\MonitoringController@paginate                     | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | DELETE    | horizon/api/monitoring/{tag}                          | horizon.monitoring-tag.destroy  | Laravel\Horizon\Http\Controllers\MonitoringController@destroy                      | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/stats                                     | horizon.stats.index             | Laravel\Horizon\Http\Controllers\DashboardStatsController@index                    | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/api/workload                                  | horizon.workload.index          | Laravel\Horizon\Http\Controllers\WorkloadController@index                          | web,Laravel\Horizon\Http\Middleware\Authenticate |
|        | GET|HEAD  | horizon/{view?}                                       | horizon.index                   | Laravel\Horizon\Http\Controllers\HomeController@index                              | web,Laravel\Horizon\Http\Middleware\Authenticate |
Источник

Ответы (1)

avatar
inet123
8 апреля 2018 в 12:16
2

Самым быстрым способом будет создание простого промежуточного программного обеспечения, в котором вы прервете работу, если это конкретный пользователь.

Чтобы создать промежуточное ПО, вы можете использовать ремесленную команду make:middleware

php artisan make:middleware LimitUserIdX

В только что созданном файле (app/Http/Middleware/LimitUserIdX.php) вы можете просто проверить, является ли идентификатор пользователя для аутентификации X, и если это так, прервать работу с кодом ошибки 403 (отказано в доступе), например:

public function handle($request, Closure $next)
{
    $userId = Auth::id();
    if($userId == 5) {
        abort(403);
    }

    return $next($request);
}

измените 5 на пользователя, которого вы хотите ограничить.


Изменить: я не понял вопрос, это исправление.

Вы должны добавить вновь созданное промежуточное ПО в глобальный список промежуточного ПО Laravel. Просто перейдите в App/Http/Kernel.php и добавьте класс в $middleware var. Это заставит Laravel запускать промежуточное ПО для всех HTTP-запросов к вашему приложению (без необходимости добавлять его в каждое определение маршрута).

Затем вы также захотите отредактировать само промежуточное ПО, чтобы проверить запрошенный метод перед прерыванием, например:

public function handle($request, Closure $next)
{
    $userId = Auth::id();
    if(request()->method() != "GET" && request()->method() != "HEAD" && $userId == 5) {
        abort(403);
    }

    return $next($request);
}
SNaRe
8 апреля 2018 в 12:38
0

Я полагаю, это также ограничит доступ к GET? Я просто хочу, чтобы они не ВСТАВЛЯЛИ ОБНОВЛЕНИЕ. Они могут получить доступ к любым страницам.

inet123
8 апреля 2018 в 13:38
0

Вы можете поместить промежуточное ПО на маршруты, которые хотите ограничить. Если что-то непонятно, поделитесь кодом маршрута.

SNaRe
8 апреля 2018 в 13:48
0

Я добавил к исходному вопросу. Однако вместо того, чтобы добавлять ограничения для определенных маршрутов, я просто хотел бы сказать, что для конкретных пользователей методы POST, DELETE, PATCH, PUT будут отключены.

SNaRe
9 апреля 2018 в 07:26
0

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

SNaRe
9 апреля 2018 в 08:01
0

В Kernel.php -> protected $middleware я добавил \App\Http\Middleware\LimitDemoUser::class, В начало промежуточного программного обеспечения я добавил use Illuminate\Support\Facades\Auth; но идентификатор пользователя равен нулю

SNaRe
9 апреля 2018 в 09:40
0

Я нашел решение и для этого. Проверьте это на coderhelper.com/a/49729783/980048.