【问题标题】:How can we add multiple checks in a middleware to perform certain check in Laravel我们如何在中间件中添加多个检查以在 Laravel 中执行某些检查
【发布时间】:2020-04-03 17:56:05
【问题描述】:

我最近开始学习 Laravel,我正在开发一个 CRUD 博客,其中用户分为 3 个角色。所有者、管理员和作者。因此,我希望所有者成为可以在“管理员”帖子中创建或删除用户的最高权限。 第二个身份验证者应该是管理员,他可以管理、确认或删除博客中的帖子,并且几乎可以做所有者可以做的所有事情,但不能禁止或降级所有者。

所以我创建了一个用户页面,显示所有注册用户的列表:localhost:8000/users 现在我只希望所有者和管理员访问此页面,而不是作者。所以为了实现这一点,我在用户模型中创建了两个函数来检查用户是否是所有者(isOwner())和用户是否是管理员(isAdmin()),然后制作了一个中间件。现在在中间件中,我想添加规则,如果用户是所有者或管理员,让他们访问用户页面,否则将他们返回主页并闪烁错误消息。 我的中间件代码如下

public function handle ($request, Closure $next) {
    if (!auth()->user()->isOwner() || !auth()->user()->isAdmin()) {
        session()->flash('error', 'You are not authenticated to perform this action');
        return redirect('home');
    }
    return $next($request);
}

但这并不是我想要的。这只是现在允许任何人访问用户页面。当我从 if 语句中删除 OR (||) 时,它工作正常,但只检查管理员或所有者。我怎样才能使它适用于两者?难道我做错了什么?我尝试了许多不同的方法,但没有一个对我有用

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    只要改变条件:

    public function handle ($request, Closure $next) {
        if (auth()->user()->isOwner() || auth()->user()->isAdmin()) {
            return $next($request);
        } else {
            session()->flash('error', 'You are not authenticated to perform this action');
            return redirect('home');        
        }
    }
    

    但是我们使用策略和门,就像博客用户可以删除博客和管理员可以删除该博客一样,我们也可以使用中间件,如果您想针对特定模块或表执行此操作,请使用策略和门,在策略的帮助下,您可以管理不同条件下的所有 CRUD 操作。

    【讨论】:

    • 你真的不需要 else 那里。
    • 是的,我知道不需要 else,但要制作结构化和干净的代码。
    猜你喜欢
    • 2017-08-17
    • 2018-08-19
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多