php - 我们如何在中间件中添加多个检查以在 Laravel 中执行某些检查
问题描述
我最近开始学习 Laravel,我正在开发一个 CRUD 博客,其中用户分为 3 个角色。所有者、管理员和作者。因此,我希望所有者成为可以在“管理员”帖子中创建或删除用户的最高权限。第二个授权应该是管理员,他可以管理、确认或删除博客中的帖子,并且几乎可以做所有者可以做的所有事情,但不能禁止或降级所有者。
所以我创建了一个用户页面,其中显示所有注册用户的列表说:localhost:8000/users
现在我只希望所有者和管理员访问此页面,而不是作者。因此,为了实现这一点,我在 User 模型中创建了两个函数来检查用户是否是所有者(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 (||) 时,它工作正常,但只检查管理员或所有者。我怎样才能使它适用于两者?难道我做错了什么?我尝试了许多不同的方法,但没有一个对我有用
解决方案
只需更改条件:
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 操作。
推荐阅读
- java - 为什么 SpringAOP @pointcut 中的这个语法错误没有弹出任何错误?
- javascript - 超级表达式必须为 null 或函数(自定义标记)
- android - 如何更改对话框的文本?
- python-2.7 - Unix 上的 Python 脚本在 csv 文件上写入,但在 Windows 7 中文件末尾的符号不可读
- bash - Linux/Bash:如果表中的 id 相同,则替换
- r - 减少 R 中向量元素的总和
- java - java.security.NoSuchAlgorithmException:PKCS11 KeyStore 不可用,尝试在 java 11 中使用 SUNPKCS11 启用 FIPS 模式
- python - 在 pd.DataFrame.query() 之后插入值并保留原始数据
- .net - SMTP 服务器需要安全连接,或者客户端未仅在 Azure 上进行身份验证
- android - Cordova Chrome OS 从平板电脑模式切换到笔记本电脑模式?