Php Auth::id()可以';无法找到用户id并返回null,laravel
我在文章上设置喜欢和不喜欢选项。但在LikeControl中存在问题。当我按下like按钮时,它会显示-> SQLSTATE[23000]:完整性约束冲突:1048列“用户id” 不能为空(SQL:insert intoPhp Auth::id()可以';无法找到用户id并返回null,laravel,php,laravel,Php,Laravel,我在文章上设置喜欢和不喜欢选项。但在LikeControl中存在问题。当我按下like按钮时,它会显示-> SQLSTATE[23000]:完整性约束冲突:1048列“用户id” 不能为空(SQL:insert intolikes(user\u id,article\u id, 在处更新,在处创建)值(?,5,2019-05-30 07:58:34, 2019-05-3007:58:34) 更新JWT和路线 类似模型: class Like extends Model { public
likes
(user\u id
,article\u id
,
在
处更新,在
处创建)值(?,5,2019-05-30 07:58:34,
2019-05-3007:58:34)
更新JWT和路线
类似模型:
class Like extends Model
{
public $timestamps = true;
public $with = ["user"];
protected $fillable = ["user_id", "article_id"];
public function article()
{
return $this->belongsTo("App\Article");
}
public function user()
{
return $this->belongsTo("App\User");
}
}
就像控制者一样:
use Auth;
use App\Article;
use App\Like;
public function like($id)
{
$article = Article::find($id);
$like = Like::create([
"user_id" => Auth::id(),
"article_id" => $article->id
]);
return Like::find($like->id);
}
public function unlike($id)
{
$article = Article::find($id);
Like::where("user_id", Auth::id())
->where("article_id", $article->id)
->first()
->delete();
return 1;
}
我不太清楚为什么Auth::id()
找不到用户id并返回null
将JWT与vue.js一起使用
路线:
Route::group(['prefix' => 'auth'], function ($router) {
Route::post('register', 'AuthController@register');
Route::post('login', 'AuthController@login');
Route::post('logout', 'AuthController@logout');
Route::post('refresh', 'AuthController@refresh');
Route::post('me', 'AuthController@me');
});
Route::get("/like/{id}", [
"uses" => "LikeController@like"
]);
Route::get("/unlike/{id}", [
"uses" => "LikeController@unlike"
]);
AuthController和User
要设置控制器和用户模型,我遵循文档:尝试导入Auth
使用light\Support\Facades\Auth代码>
然后像这样获得身份证:
$user = Auth::user();
$id = $user->id;
Route::group([
'middleware' => 'api',
], function ($router) {
Route::get("/like/{id}", [
"uses" => "LikeController@like"
]);
Route::get("/unlike/{id}", [
"uses" => "LikeController@unlike"
]);
});
希望这有帮助
在kernel.php上添加此中间件
protected $middlewareGroups = [
'web' => [
\Illuminate\Session\Middleware\StartSession::class,
],
];
此链接可能有助于:
首先使用此代码:确保路由
或控制器
受到身份验证中间件的保护
second:如果使用了多个保护
,请确保对身份验证使用了正确的保护
you should specify your guard name like this: `Auth::guard('admin')->id()`
您没有从路由组中指定中间件=>api
。还包括类似的
相关路由或此路由组中的任何受保护路由
config/auth.php
应更新为
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
...
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
routes/api.php中的
Route::post('login', 'AuthController@login')->name('login');
Route::group(['middleware' => 'api'], function ($router) {
Route::group(['prefix' => 'auth'], function ($router) {
Route::post('register', 'AuthController@register');
# Route::post('login', 'AuthController@login'); // commented.
Route::post('logout', 'AuthController@logout');
Route::post('refresh', 'AuthController@refresh');
Route::post('me', 'AuthController@me');
});
Route::get("/like/{id}", [
"uses" => "LikeController@like"
]);
Route::get("/unlike/{id}", [
"uses" => "LikeController@unlike"
]);
});
您似乎没有使用auth保护您的LikeControl路由
除非构造函数的LikeController
中有类似的内容:
public function __construct()
{
$this->middleware('auth:api');
}
然后,您应该让LikeControl路由受到如下保护:
$user = Auth::user();
$id = $user->id;
Route::group([
'middleware' => 'api',
], function ($router) {
Route::get("/like/{id}", [
"uses" => "LikeController@like"
]);
Route::get("/unlike/{id}", [
"uses" => "LikeController@unlike"
]);
});
那么使用登录的正确方法是
auth('api')->user()
或
嗯
因此,当我在vue js中使用jwt时,我的应用程序也遇到了这个问题。
用于获取当前的Auth::user()
您需要在请求时传递令牌。
若您检查jwt核心文件,它将从令牌获取用户。
我猜你不是在传递令牌
如果是,请将令牌与您的请求一起传递。
并检查jwt
的文档。你的软件包安装正确了吗?
请记住,对于laravel 5.5或更高版本,要使用的软件包版本是jwt>1.0.0
另外,请正确检查该版本的文档。您也可以使用您拥有OAuth2:-)的Laravel的passport
关于Laravel护照的Laravel文件说明:
Laravel使用Laravel Passport使API身份验证变得轻而易举,
它为您的Laravel提供了完整的OAuth2服务器实现
几分钟内申请。护照是建在护照顶部的
由Andy Millington和Simon维护的联盟OAuth2服务器
汉普
检查用户是否经过身份验证,
不要忘记使用Auth类
use Auth;
检查是否授权而不是删除,
并使用Auth::user()->id
检查Auth::user()->id;你成功登录应用程序了吗?是的,我成功了。。。但是我将JWT与vue.js一起使用,这是原因吗?也许?将JWT与vue.js一起使用
无法使用Auth::user()。您必须使用$user=JWTAuth::toUser($params['token'])
请提供更多关于如何实现JWT的信息,例如,您是否在使用某个包(它是什么),如何将JWT身份验证强制到您的控制器/路由,前提是路由配置可能也很有用。好的,错误现在已更改。上面说,试图获取非对象的属性
更新了答案。我尝试了更新,但结果是一样的<代码>尝试获取非对象的属性
谢谢,我做了完全相同但仍然相同的错误<代码>尝试获取非对象的属性顺便说一句,如果我在组中插入其他路由,则会出现一个错误,显示为:TypeError:无法读取未定义的属性“user”\n您可以将其排除在组外。或者可以添加<代码>公共函数uu construct(){$this->middleware('auth:api',['except'=>['login']])}好的,你把我弄丢了:)如果你编辑你的答案,我会的appreciate@parabellum现在试试这个解决方案。好的,我试过了。现在错误被改变了<代码>路由[登录]未定义。和抛出新的InvalidArgumentException(“路由[{$name}]未定义”)代码>请参考关于命名路由的讨论:(您可能需要像这样定义登录路由:路由::post('login',['as'=>'login','uses'=>'AuthController@login“];
)如果您也在问题中提供您的AuthConroller
,则可能会很有用。
if (Auth::user())
{
Like::where("user_id", Auth::user()->id)
->where("article_id", $article->id)
->first()
->delete();
}