首页 > 解决方案 > 会话过期时调用成员函数出错(中间件)

问题描述

当我的会话到期并重新加载页面时,我收到以下错误(在以下代码块中指示的行):

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;
    }
}

标签: phplaravellaravel-7

解决方案


$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.');
    }
}

推荐阅读