php - 会话过期时调用成员函数出错(中间件)
问题描述
当我的会话到期并重新加载页面时,我收到以下错误(在以下代码块中指示的行):
hasRole()
错误:调用成员函数null
class AdminMiddleware
{
public function handle($request, Closure $next) {
if ($request->user()->hasRole('admin')) // this line
return $next( $request );
else
abort( 401, 'Esta acción no está autorizada.' );
}
}
hasRole()
是我User
模型中的一个函数,用于检查用户是否有权访问某些管理路由:
class User extends Authenticatable
{
/**
* Role-user relation (one-to-many)
*/
public function roles() {
return $this->belongsToMany( Role::class )->withTimestamps();
}
/**
* Authorize roles
*/
public function authorizeRoles($roles) {
if ($this->hasAnyRole($roles))
return true;
abort( 401, 'Esta acción no está autorizada.' );
}
/**
* Check if user has specified role
*/
public function hasRole($role) {
if ($this->roles()->where('name', $role)->first())
return true;
return false;
}
}
解决方案
$request->user()
如果会话实际存在,则仅包含经过身份验证的用户对象。如果会话像您描述的那样过期,这将返回 null。当您使用它时,您必须考虑这一点:
class AdminMiddleware
{
public function handle(Request $request, Closure $next)
{
if (\Auth::check() && $request->user()->hasRole('admin')) {
return $next($request);
}
abort(401, 'Esta acción no está autorizada.');
}
}
推荐阅读
- substrate - Make Init bash: mingw-get: command not found
- javascript - React.JS:如何制作存储在公共文件夹中的图像的表单数据
- reactjs - 导致错误的 react-redux v6 和 v7 之间的区别?
- spring - 在 spark 数据帧上调用 show 方法后,我看不到 spring boot/spark 应用程序中显示的数据
- sapui5 - 刷新后如何获取 TwoColumnsMidExpanded
- google-bigquery - Bigquery 用一些 000 替换空结果或空值
- performance - 如何在 Jmeter 中生成 AWS Cognito Bearer 令牌?
- c++ - 如何使用 boost 库获取谷歌海拔 api?
- css - 禁用/启用时输入背景颜色变化
- google-apps-script - 获取 Google 表格脚本以自动重复相同的步骤