Laravel auth()->guard() 使用 vue js 返回 null
Posted
技术标签:
【中文标题】Laravel auth()->guard() 使用 vue js 返回 null【英文标题】:Laravel auth()->guard() returns null using vue js 【发布时间】:2019-07-29 02:03:52 【问题描述】:我在 vue.js 中有一个登录表单。我只需要使用 vue.js 和 laravel 登录用户。登录后,用户将重定向到仅使用 laravel 开发的仪表板。我正在尝试登录,但它不起作用,auth()->guard
返回 null 以便用户重定向到登录页面而不是仪表板。当我在这种情况下使用邮递员时,效果很好。
Vue js
this.$http.post('http://localhost/project/admin/vendors/validate_login',phone_number : this.phone_number,
headers:
"Access-Control-Allow-Origin": "*"
)
.then((response) =>
if(response.data.status == 'success')
window.location = "http://localhost/project/admin/vendors/dashboard";
)
Laravel - 验证登录:
public function validate_login(Request $request)
$arr_rules = array();
$status = false;
$remember_me = "";
$arr_rules['phone_number'] = "required";
$validator = validator::make($request->all(),$arr_rules);
if($validator->fails())
return response()->json([
'status' => 'error',
'msg' => "Mobile number is empty"
]);
$obj_group_vendor = $this->UsersModel
->where('phone_number',$request->only('phone_number'))
->first();
if($obj_group_vendor)
if($this->auth->attempt(['phone_number' => $request->phone_number,
'role_id' => 3]))
return response()->json([
'status' => 'success',
'msg' => "You are successfully login to your account."
]);
else
return response()->json([
'status' => 'error',
'msg' => "Invalid login credential."
]);
else
return response()->json([
'status' => 'error',
'msg' => "Invalid login credentials."
]);
return;
路线:
$web_vendor_path = config('app.project.vendor_panel_slug');
Route::group(array('prefix' => $web_vendor_path,
'middleware'=> ['vendor_auth_check']), function ()
$route_slug = 'vendor_';
Route::post('validate_login', ['as' => $route_slug.'validate',
'uses' => $module_controller.'validate_login']);
);
Route::group(array('prefix' => $web_vendor_path,
'middleware'=>'auth_vendor'), function ()
use($web_vendor_path)
$route_slug = 'vendor_';
$module_controller = "Vendor\DashboardController@";
Route::get('/dashboard',['as' => $route_slug.'index',
'uses' => $module_controller.'index']);
);
任何帮助将不胜感激。
【问题讨论】:
为什么不使用 laravel 护照?如果您不想使用 laravel 护照,请使用 laravel 默认登录方法 @bhavinjr 实际上我已经完成了仪表板的所有功能。这是我必须使用 vue js 的唯一更改 需要检查的几件事: 1. 检查您是否启用了会话。默认 Laravel 身份验证需要它。 2. 检查您的用户表是否有标准 id 字段,或者您在模型中为用户 id 标识 $primaryKey 字段。 你能出示一下你的路由器吗?另外,你能检查一下回调中的响应是什么吗?谢谢 @punk73 我已经更新了我的问题。它返回 null。 【参考方案1】:只是在这里吐出一些想法:
尝试为所有 POST 请求设置 'Content-Type': 'application/x-www-form-urlencoded'
标头。
此外,Access-Control-Allow-Origin
是一个应该在网络服务器的响应中的标头。它不是您应该在 javascript 请求中发送的标头。
【讨论】:
【参考方案2】:确保您在 app/Providers/RouteServiceProvider.php
中的路由文件中启用了 Web 中间件然后在 app/Http/Kernel.php 中检查 \Illuminate\Session\Middleware\StartSession::class
,在 $middlewareGroups['web']
中添加并启用
【讨论】:
是的,这两件事都和你说的一样,但还是不行。【参考方案3】:从浏览器发出 POST/PATCH/PUT/DELETE 请求时,您需要包含页面的 CSRF 令牌。
this.$http.post('http://localhost/project/admin/vendors/validate_login',phone_number : this.phone_number,
headers:
"Access-Control-Allow-Origin": "*",
"X-CSRF-TOKEN": document.head.querySelector('meta[name="csrf-token"]').content
)
.then((response) =>
if(response.data.status == 'success')
window.location = "http://localhost/project/admin/vendors/dashboard";
)
并确保在所有页面中都包含 CSRF 作为元标记:
<meta name="csrf-token" content=" csrf_token() ">
【讨论】:
我已禁用此路由以使用我们的 csrf 令牌。所以不需要传递 csrf 令牌【参考方案4】:如果您使用 api 保护,请执行此操作auth()->guard('api')
。
【讨论】:
以上是关于Laravel auth()->guard() 使用 vue js 返回 null的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.2.29 multiauth 使用 Auth::guard('one'),Auth::guard('two')