Laravel 5.2:如何在中间件中使用身份验证

Posted

技术标签:

【中文标题】Laravel 5.2:如何在中间件中使用身份验证【英文标题】:Laravel 5.2: How to use auth in middleware 【发布时间】:2016-04-20 17:35:18 【问题描述】:

我创建了一个新的中间件名称 Adminpanel

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class Adminpanel

    public function handle($request, Closure $next)
    
        if(Auth::user()->role == 'admin')
            return $next($request);
        else
            return redirect('admin/login');
        
    

并注册中间件

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'adminpanel' => \App\Http\Middleware\Adminpanel::class,
];

和路线

Route::group(['middleware' => ['web','adminpanel']], function () 
Route::get('/admin/dashboard/', 'admin\Dashboard@index');
//

);

但是当我运行时,它要求我尝试获取非对象的属性,这意味着我无法在这里访问 Auth 类,有人可以告诉我错误是什么以及如何访问中间件中的 Auth Facade。

这是我的验证码

public function authenticate(Request $request)

    if (Auth::attempt(['email' => $request->input('email'), 'password' => $request->input('password'), 'role' => 'admin'], $request->input('remember'))) 
    
        return redirect()->intended('admin/dashboard');
    
    else
        return redirect('admin')->with('response',-1);
    

谢谢

【问题讨论】:

请看这里。我已经做了你需要的。 ***.com/questions/34614753/… 我正在为不同类型的用户使用单个数据库表和角色字段 【参考方案1】:

这并不意味着您无法访问 Auth 类。这意味着,该用户未通过身份验证,Auth::user() 返回 NULL

确保只有经过身份验证的用户才能访问您的路由,方法是使用该路由的 auth 中间件或首先检查用户是否经过身份验证:

if(Auth::check() && Auth::user()->role == 'admin')
  return $next($request);
 else 
  return redirect('admin/login');

【讨论】:

它有什么变化?这是导致错误的代码部分吗? 不,authentication 功能成功验证用户身份并重定向到仪表板页面,但中间件中的身份验证正在工作,正如我上面提到的那样。 上面的修复应该可以修复错误,但是如果您的身份验证无法正常工作,它会将您重定向回登录页面 - 您能否确认它与上述代码一样工作?如果是这样,我们将修复您的身份验证 你的用户模型的主键是什么? 你是对的,身份验证不起作用,我的用户表主键是 id,手动身份验证方法如上所述。参考:laravel.com/docs/5.2/authentication

以上是关于Laravel 5.2:如何在中间件中使用身份验证的主要内容,如果未能解决你的问题,请参考以下文章

身份验证控制器中的 Laravel 5.2 Web 中间件导致 csrf 令牌不匹配

Laravel 5.2 - 方法身份验证不存在

如何在 laravel 5.2 中使用多重身份验证 [关闭]

在 laravel 5.2 中禁用特定路由的 Web 中间件

在AuthController中覆盖laravel的5.2身份验证方法

在 laravel 5.2 中使用默认身份验证路由对用户进行身份验证后设置会话数据