Laravel 如何在控制器功能中将签名路由用作刀片视图
我有一个基于团队的应用程序,每个团队只能看到和使用自己的视图和数据。有一个配置文件视图,团队可以通过类似“…/admin/teams/2/show_profile”的URL更改关于其团队设置的信息。数字2表示团队的ID号,因此如果用户选择这样做,他们可以将该编号更改为任何其他编号,该视图将调出其他团队的配置文件详细信息。因此,我需要这样做,用户不能改变这个特定的URL,以防止他们能够覆盖路由。我一直在考虑使用一个签名的URL作为应该完成的方式,但是我在控制器中实现它时遇到了问题。我已经添加了Laravel 如何在控制器功能中将签名路由用作刀片视图,laravel,routes,signed,Laravel,Routes,Signed,我有一个基于团队的应用程序,每个团队只能看到和使用自己的视图和数据。有一个配置文件视图,团队可以通过类似“…/admin/teams/2/show_profile”的URL更改关于其团队设置的信息。数字2表示团队的ID号,因此如果用户选择这样做,他们可以将该编号更改为任何其他编号,该视图将调出其他团队的配置文件详细信息。因此,我需要这样做,用户不能改变这个特定的URL,以防止他们能够覆盖路由。我一直在考虑使用一个签名的URL作为应该完成的方式,但是我在控制器中实现它时遇到了问题。我已经添加了us
use\lightlight\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?您需要将新的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,
];
}
目前,我们在routes/web.php文件中有以下event.rsvp路由
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
在刀片服务器中使用签名URL,如下所示:
\Illuminate\Support\Facades\URL::signedRoute
例如
<a href="{{ \Illuminate\Support\Facades\URL::signedRoute('formreportlog.showformlog',['report_id'=>$person->id ] ) }}"
class="btn btn-success">@lang('user.active')</a>
我会编写一个中间件来检查用户的团队id是否与URL相同,如果不相同,则给出403错误并进行处理。假设您有一个用户团队id为@hmmeves的表。这听起来是一个有趣的选择,但我对此一无所知。您是否可以对代码的外观或我可以研究的任何链接提出建议,以尝试实现这一点?@hmmeves您是否认为是这样的。因此,基于此,我的问题是,如何将信息从功能正常的返回视图路由(如我的示例)转换为功能正常的URL::SingleDurote?这是我的问题,我无法获取URL::signedRoute以在我的应用程序中生成正确的刀片视图。有什么建议吗?