【发布时间】:2020-08-08 18:48:09
【问题描述】:
我有一个基于团队的应用程序,每个团队只能使用自己的视图和数据查看和运行。有一个配置文件视图,团队可以使用类似“.../admin/teams/2/show_profile”的 URL 更改有关其团队设置的信息。数字 2 代表团队的 ID 号,因此如果用户选择这样做,他们可以更改号码到任何其他号码,视图会拉出另一个团队的个人资料详细信息。所以我需要这样做,这样用户就不能更改这个特定的 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?
【问题讨论】:
-
我会编写一个中间件来检查用户的团队 ID 是否与 URL 相同,如果不是,则给出 403 错误并进行处理。假设您有一张带有用户团队 ID 的表格。
-
@hmmeves。这听起来像是一个有趣的选择,但我对此一无所知。您能否对代码的外观或我可以研究以尝试完成此操作的任何链接提出建议?
-
@hmmeves 你在想this post
-
是的,就像那样。