Как использовать подписанный маршрут в качестве блэйда в функции контроллера - PullRequest
0 голосов
/ 06 марта 2020

У меня есть командное приложение, в котором каждая команда может видеть и работать только со своими представлениями и данными. Существует представление профиля, где команды могут изменять информацию о настройках своих команд с помощью URL-адреса, например «... / admin / team / 2 / show_profile». Число 2 представляет идентификационный номер команды, поэтому, если пользователь решит это сделать, он может изменить номер на любой другой номер, и представление будет подтягивать детали профиля другой команды. Поэтому мне нужно сделать так, чтобы пользователи не могли изменить этот конкретный c URL, чтобы они не могли переопределить маршрут. Я пытался использовать подписанный URL как способ сделать это, но у меня были проблемы с его реализацией в контроллере. Я уже добавил use \Illuminate\Support\Facades\URL; в верхней части контроллера.

Вот мой маршрут:

Route::get('teams/{id}/show_profile', ['uses' => 'Admin\TeamsController@show_profile', 'as' => 'teams.show_profile'])->middleware('signed');

Вот моя функция контроллера:

public function show_profile($id)
    {
        if (! Gate::allows('team_view')) {
            return abort(401, 'Sorry you are not authorized for this action at this time');
        }

        $created_bies = \App\User::get()->pluck('name', 'id')->prepend(trans('global.app_please_select'), '');
        $created_by_teams = \App\Team::get()->pluck('name', 'id')->prepend(trans('global.app_please_select'), '');

        $query = \App\User::query();
        $query->select('users.*')
            ->leftJoin('team_user', function ($join) use ($id) { // include users with this church as an additional church
                $join->on('team_user.user_id', '=', 'users.id');
                $join->on('team_user.team_id', '=', DB::raw("'".$id."'"));
            })
            ->where('users.team_id', $id)
            ->orWhere('team_user.team_id', '=', $id);
        $query = $query->getQuery();
        $user_list = $query->get();
        $user_id_array = [];
        foreach ($user_list as $one_user) {
            $user_id_array[] = $one_user->id;
        }
        $users = \App\User::whereIn('id', $user_id_array)->get();

        $interests = \App\Interest::where('created_by_team_id', $id)->get();
        $activity = \App\Activity::where('created_by_team_id', $id)->get();
        $usersettings = \App\Usersetting::where('created_by_team_id', $id)->get();

        $team = Team::findOrFail($id);

        return view('admin.teams.show_profile', compact('team', 'users', 'interests', 'activity', 'usersettings'));
    }

Так что я не могу понять, что мне нужно затем сгенерируйте подписанный URL-адрес. Я попытался модифицировать возвращаемое представление с какой-либо версией return URL::signedRoute(...); или $url = action('TeamController@team_profile', [...]); с параметрами, переданными через скобки и скобки, но я не могу понять, как заставить его работать должным образом , Я знаю, что промежуточное программное обеспечение на маршруте работает, потому что я проверил его, используя исходный вид возврата. Итак, вопрос в том, что мне нужно сделать, чтобы перевести обратный просмотр в URL с подписанным маршрутом?

1 Ответ

0 голосов
/ 06 марта 2020

Вам потребуется добавить новую ValidateSignature в промежуточное ПО вашего маршрута в /app/Http/Kernel.php.

protected $routeMiddleware = [
       // ...
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+   'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
   ];
 }

В настоящее время у нас есть следующий маршрут event.rsvp в наших маршрутах /web.php file.

 Route::get('event/{id}/rsvp/{user}/{response}', function ($id, $user, $response) 
 {
   // Add response from user for event.
 })->name('event.rsvp')->middleware('signed');

, и наш URL создается так

use \Illuminate\Support\Facades\URL;
Url::signedRoute('event.rsvp', ['id' => 25, 'user' => 100, 'response' => 'yes']);

, который генерирует:

https://example.com/event/25/rsvp/100/yes?signature=30a3877b00890fff0d7ca25f82c6387ff16a98d21008ddc9689ed3c20ef13cd4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...