通过当前用户在Laravel路线?

时间:2016-08-06 23:34:11

标签: php laravel

我试图制作一个"个人资料设置"应用程序中的部分。 问题是,我学会了如何做到这一点" Admin"方式,路线将是/users/{user}/edit,将调用控制器上的编辑方法,它将返回编辑视图。在那里,我将有一个表单,用户将修补到路由users/{user},它将调用控制器上的更新方法。

但我不希望任何人修改其他用户,因此我想知道是否有办法将此路线限制为仅限当前用户。

提前致谢。

3 个答案:

答案 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();

因此,只能编辑登录用户(他们自己)。