【问题标题】:Pass current user to route in Laravel?将当前用户传递给 Laravel 中的路由?
【发布时间】:2016-08-07 14:32:15
【问题描述】:

我正在尝试在应用程序中创建“配置文件设置”部分。 问题是,我学会了如何以“管理员”方式执行此操作,路由将是 /users/{user}/edit,将调用控制器上的编辑方法并返回编辑视图。在那里我会有一个表单,用户将修补到路由users/{user},它会调用控制器上的更新方法。

但我不希望任何人编辑其他用户,所以我想知道是否有办法将此路由限制为仅限当前用户。

提前致谢。

【问题讨论】:

    标签: php laravel


    【解决方案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
    }
    

    或者我更喜欢使用拒绝方法的其他方法,并将其包含在我的控制器方法的开头并返回 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

    【讨论】:

      【解决方案2】:

      在视图中应该有一个按钮或链接,点击时将 ID 传递给所需的路线。

      例子:

      要获取当前登录的用户 ID,您应该这样做

      $user = Auth::user()->id;
      

      而且直接在路由中就可以得到喜欢

      <a href="{{ url('route', Auth::user()->id;  }}">Edit</a>
      

      现在当有人点击编辑按钮/链接时,路径将类似于route/currentuserid

      【讨论】:

      • 但是是什么阻止了用户直接输入带有另一个 id 的 url?
      • 如果您的数据库中不存在传递的$id,您可以在控制器中检查,然后抛出错误或消息。
      【解决方案3】:

      您不需要传递用户 ID,因为那里的用户已经登录并且应该能够编辑自己,因此只针对登录的用户。

      所以你可以使用路由/user/edit/user/updateetc

      只需获取当前用户详细信息,如

         Auth::user()->id
      

      或其他类似的东西

         $user = Auth::user();
      

      因此只有登录的用户(他们自己)可以被编辑。

      【讨论】:

        猜你喜欢
        • 2021-03-24
        • 1970-01-01
        • 2017-08-04
        • 1970-01-01
        • 2015-10-15
        • 2014-03-24
        • 2015-12-02
        • 2019-03-03
        • 2018-06-20
        相关资源
        最近更新 更多