删除用户

删除用户的动作,有两个逻辑需要提前考虑:

  • 只有当前登录用户为管理员才能执行删除操作;
  • 删除的用户对象不是自己(即使是管理员也不能自己删自己)。

我们在开发更新用户功能时,已经创建了用户授权策略类,让我们接着对该授权策略类进行编辑,加上 destroy 删除用户动作相关的授权。

app/Policies/UserPolicy.php

id === $user->id;
    }

    public function destroy(User $currentUser, User $user)
    {
        return $currentUser->is_admin && $currentUser->id !== $user->id;
    }
}

Laravel 授权策略提供了 @can Blade 命令,允许我们在 Blade 模板中做授权判断。接下来让我们利用 @can 指令,在用户列表页加上只有管理员才能看到的删除用户按钮。

resources/views/users/_user.blade.php

  • {{ $user->name }} {{ $user->name }} @can('destroy', $user)
    {{ csrf_field() }} {{ method_field('DELETE') }}
    @endcan
  • 页面结构添加完成之后,让我们接着对样式进行优化。

    resources/assets/sass/app.scss

    .
    .
    .
    /* Users index */
    .
    .
    .
    .delete-btn {
      float: right;
      position: relative;
      right: 0;
    }
    

    在管理员点击删除用户按钮之后,删除动作会映射到用户控制器的 destroy 动作上,让我们为控制器添加基本的用户删除动作。

    app/Http/Controllers/UsersController.php

    delete();
            session()->flash('success', '成功删除用户!');
            return back();
        }
    }
    

    现在的删除动作是对所有登录用户开放的,为此我们还需要对删除动作加上授权策略,只允许已登录的 管理员 进行删除操作。

    删除授权策略 destroy 我们已经在上面创建了,这里我们在用户控制器中使用 authorize 方法来对删除操作进行授权验证即可。在删除动作的授权中,我们规定只有当前用户为管理员,且被删除用户不是自己时,授权才能通过。

    app/Http/Controllers/UsersController.php

    authorize('destroy', $user);
            $user->delete();
            session()->flash('success', '成功删除用户!');
            return back();
        }
    }
    

    你可能感兴趣的:(删除用户)