【发布时间】:2016-08-07 14:32:15
【问题描述】:
我正在尝试在应用程序中创建“配置文件设置”部分。
问题是,我学会了如何以“管理员”方式执行此操作,路由将是 /users/{user}/edit,将调用控制器上的编辑方法并返回编辑视图。在那里我会有一个表单,用户将修补到路由users/{user},它会调用控制器上的更新方法。
但我不希望任何人编辑其他用户,所以我想知道是否有办法将此路由限制为仅限当前用户。
提前致谢。
【问题讨论】:
我正在尝试在应用程序中创建“配置文件设置”部分。
问题是,我学会了如何以“管理员”方式执行此操作,路由将是 /users/{user}/edit,将调用控制器上的编辑方法并返回编辑视图。在那里我会有一个表单,用户将修补到路由users/{user},它会调用控制器上的更新方法。
但我不希望任何人编辑其他用户,所以我想知道是否有办法将此路由限制为仅限当前用户。
提前致谢。
【问题讨论】:
从 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
}
或者我更喜欢使用拒绝方法的其他方法,并将其包含在我的控制器方法的开头并返回 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 和 cannot like 这样检查刀片文件中的权限:
@can('updateProfile', $user)
// Show something only to the user that can edit the $user's profile
@endcan
更多信息请查看docs。
【讨论】:
在视图中应该有一个按钮或链接,点击时将 ID 传递给所需的路线。
例子:
要获取当前登录的用户 ID,您应该这样做
$user = Auth::user()->id;
而且直接在路由中就可以得到喜欢
<a href="{{ url('route', Auth::user()->id; }}">Edit</a>
现在当有人点击编辑按钮/链接时,路径将类似于route/currentuserid。
【讨论】:
$id,您可以在控制器中检查,然后抛出错误或消息。
您不需要传递用户 ID,因为那里的用户已经登录并且应该能够编辑自己,因此只针对登录的用户。
所以你可以使用路由/user/edit和/user/updateetc
只需获取当前用户详细信息,如
Auth::user()->id
或其他类似的东西
$user = Auth::user();
因此只有登录的用户(他们自己)可以被编辑。
【讨论】: