我使用以下代码为管理员角色创建中间件:
php artisan make:middleware AdminMiddleware
之后,我为登录页面创建了一条路线:
Route::get('admin/login', ['middleware'=>'web','as'=>'admin.login','uses'=>'AdminController@loginView']);
Route::post('admin/login',['middleware'=>'web','as'=>'admin.login','uses'=>'AdminController@login']);
Route::group(['prefix'=>'admin','middleware' => ['auth.admin','web']], function()
{
Route::get('/', ['as'=>'admin.home','uses'=>'AdminController@index']);
Route::get('/home', ['as'=>'admin.home','uses'=>'AdminController@index']);
});
控制器是
class AdminController extends Controller
{
//
function index(){
return 'welcome';
}
function loginView(){
return view('admin.login');
}
function login(Request $request){
$error = $this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:5',
]);
$email = $request->input('email');
$password = $request->input('password');
$remember = $request->input('remember');
if (Auth::attempt(['email' => $email, 'password' => $password,'type'=>'admin'], $remember)) {
// Authentication passed...
Auth::login(Auth::user(), $remember);
return redirect()->route('admin.home');
}
else{//('message', 'Login Failed')
return redirect()->route('admin.login')->withErrors($request->all(), "message")->withInput();
}
}
}
在AdminMiddleware中
public function handle($request, Closure $next)
{
var_dump(Auth::user());
if(!Auth::check()){
return redirect()->route('admin.login')->withErrors('You are not logged in');
}
elseif ($request->user()->type != 'admin'){
dd($request->user());
return redirect()->route('admin.login')->withErrors('You have not authority');
}
return $next($request);
}
错误是:我总是在AdminMiddleware中为每个$ request-> user()或Auth:用户获取null。
答案 0 :(得分:5)
您以不正确的顺序将中间件传递给路由组。
现在您有了这个订单['auth.admin', 'web']
,这意味着auth.admin
中间件将在web
组的中间件之前执行,并且web
包含StartSession
1}}中间件,您在auth.admin
中没有获得认证用户所需的任何会话。
所以只需像这样切换中间件订单:
Route::group(['prefix'=>'admin','middleware' => ['web', 'auth.admin']], function () {
// now the session is set up in `web` and then you have it in `auth.admin`
});
答案 1 :(得分:-1)
在我的情况下,实际问题是PHP开始标记之前的空白行。
我使用以下核心PHP函数重定向,而不是从控制器返回视图文件,而不是使用Laravel重定向。
header('Location: /');
它打印了一个空行的实际文件。删除此行修复了我的问题。
我的代码库中有数千个文件。我的假设是我尝试了不同的脚本来在任何文件的开头找到这样的空白行,并且根据这些脚本结果没有这样的文件。我假设我的任何文件都没有空行。但是标题('Location:/')证明了我的假设并没有错,而且我在做错了。