Auth :: id()找不到用户ID并返回null,laravel

时间:2019-05-30 08:19:42

标签: php laravel

我在文章上设置喜欢和不喜欢的选项。但是在LikeController中有问题。当我按“赞”按钮时,它说->

  

SQLSTATE [23000]:违反完整性约束:1048列“ user_id”   不能为null(SQL:插入likesuser_idarticle_id,   updated_atcreated_at)值(?,5,2019-05-30 07:58:34,   2019-05-30 07: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");
    }
}

和LikeController:

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 用户

要设置控制器和用户模型,我遵循了文档:https://jwt-auth.readthedocs.io/en/develop/quick-start/

8 个答案:

答案 0 :(得分:1)

您没有从路由组中指定middleware => api。还包括like相关路由或此路由组内的任何受保护的路由。

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"
    ]);

});

答案 1 :(得分:0)

尝试这样导入Auth

use Illuminate\Support\Facades\Auth;

并获得这样的ID:

$user = Auth::user();
$id = $user->id;

希望这会有所帮助

在kernel.php上添加此middelware

protected $middlewareGroups = [
        'web' => [
            \Illuminate\Session\Middleware\StartSession::class,
        ],
];

此链接可能有帮助: Answer Link

答案 2 :(得分:0)

Auth::user()->id

使用此代码

答案 3 :(得分:0)

第一:确保routeController受身份验证中间件的保护。

秒::如果使用guard,请确保您使用正确的multiple guard进行身份验证。

you should specify your guard name like this: `Auth::guard('admin')->id()`

答案 4 :(得分:0)

您似乎没有通过auth保护LikeController路由。

除非您的LikeController中的构造函数中有这样的内容:

    public function __construct()
    {
        $this->middleware('auth:api');
    }

那么您应该像这样保护LikeController路由:

Route::group([
    'middleware' => 'api',
], function ($router) {

    Route::get("/like/{id}", [
        "uses" => "LikeController@like"
    ]);
    Route::get("/unlike/{id}", [
        "uses" => "LikeController@unlike"
    ]);

});

然后正确使用登录名的方法就是

auth('api')->user()

Auth::guard('api')->user()

答案 5 :(得分:0)

好,

所以当我在vue js中使用jwt时,我的应用程序也遇到了这个问题。 获取最新的Auth::user()

您需要在请求中传递令牌。 如果您检查jwt核心文件,它将从令牌获取用户。 而且我猜你没有传递令牌。

如果是,则将令牌与您的请求一起传递。 并检查jwt的文档。您是否正确安装了软件包? 请记住,对于laravel 5.5或更高版本,要使用的软件包版本为jwt > 1.0.0 另外,请正确检查该版本的文档。

答案 6 :(得分:0)

您也可以在拥有OAuth2的Laravel使用护照:-)

关于Laravel护照的Laravel文档说:

  

Laravel使用Laravel Passport使API身份验证变得轻而易举,   为您的Laravel提供完整的OAuth2服务器实现   只需几分钟即可完成申请。护照建立在   由Andy Millington和Simon维护的League OAuth2服务器   汉普。

You can look more information here where you see Laravel Passport Documentation

答案 7 :(得分:0)

检查用户是否已通过身份验证, 并且不要忘记使用Auth类。

use Auth;

检查auth是否要删除, 并使用Auth :: user()-> id

if (Auth::user())
{
   Like::where("user_id", Auth::user()->id)
    ->where("article_id", $article->id)
    ->first()
    ->delete();
}