我试图制作一个"个人资料设置"应用程序中的部分。
问题是,我学会了如何做到这一点" Admin"方式,路线将是/users/{user}/edit
,将调用控制器上的编辑方法,它将返回编辑视图。在那里,我将有一个表单,用户将修补到路由users/{user}
,它将调用控制器上的更新方法。
但我不希望任何人修改其他用户,因此我想知道是否有办法将此路线限制为仅限当前用户。
提前致谢。
答案 0 :(得分:1)
在视图中应该有一个按钮或链接,点击时将ID传递给所需的路径。
示例:
要抓取当前登录的用户ID,您应该这样做
$user = Auth::user()->id;
直接在路线中你可以得到它
<a href="{{ url('route', Auth::user()->id; }}">Edit</a>
现在当有人点击编辑按钮/链接时,路线将显示为route/currentuserid
。
答案 1 :(得分:1)
从版本5.1开始,Laravel的政策就是您所需要的。
您可以输入以下命令来创建新策略:
php artisan make:policy UserPolicy
在UserPolicy类中,您可以包含以下方法:
public function updateProfile(User $user, User $updatedUser) {
return $user->id === $updatedUser->id;
}
请注意:第一个参数$ user在幕后自动解析,是当前登录的用户。在应用程序中通过Gate门面检查策略时,您只需要传递第二个参数$ updatedUser。
然后,您需要在AuthServiceProvider中注册您的策略:
use Acme\User;
use Acme\Policies\UserPolicy;
...
class AuthServiceProvider extends ServiceProvider {
protected $policies = [
User::class => UserPolicy::class
]
现在,当您注册了您的政策时,您可以使用Gate门面在您的应用中进行检查,如下所示:
if(Gate::allows('updateProfile', $user)) {
// Your logic goes here
}
或者其他方法我更喜欢使用denies方法并将其包含在我的控制器方法的开头并返回http错误:
public function edit($id) {
if(Gate::denies('updateProfile', $user)) {
abort(403, 'You do not have permissions to access this page!');
}
// The check is passed and your can include your logic
}
您还可以使用can检查刀片文件中的权限,但不能这样:
@can('updateProfile', $user)
// Show something only to the user that can edit the $user's profile
@endcan
有关详细信息,请查看docs。
答案 2 :(得分:0)
您不需要传入用户ID,因为用户已经登录并且应该能够自己编辑,因此只能以登录用户为目标。
因此,您可以使用路线/user/edit
和/user/update
等
只需获取当前用户的详细信息,例如
Auth::user()->id
或其他类似
$user = Auth::user();
因此,只能编辑登录用户(他们自己)。