Symfony 6 - JWTRefreshTokenBundle - “Gesdinet\JWTRefreshTokenBundle\Entity\RefreshToken”不是有效的实体或映射的超类

Gol*_*ack 1 symfony lexikjwtauthbundle symfony6

我正在 Symfony 6 和 PHP 8.1 基础上安装 JWTRefreshTokenBundle

我按照文档操作,收到以下错误:“Gesdinet\JWTRefreshTokenBundleEntityRefreshToken”的“AppEntityRefreshToken”子类不是有效的实体或映射的超类。

我继续搜索并尝试了以下过程: https: //github.com/markitosgv/JWTRefreshTokenBundle/issues/332

但结果是一样的。

奇怪的是,在文档中,我们必须使用新的 RefreshToken 实体更新数据库,即使强制更新也绝对没有任何反应

您将在下面找到不同的文件。

如果有人有想法,我很感兴趣!提前致谢

-- 应用\Entity\RefreshToken.php

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gesdinet\JWTRefreshTokenBundle\Entity\RefreshToken as BaseRefreshToken;

/**
 * @ORM\Entity
 * @ORM\Table("refresh_tokens")
 */
class RefreshToken extends BaseRefreshToken
{
}
Run Code Online (Sandbox Code Playgroud)

-- 安全.yaml

providers:
    # used to reload user from session & other features (e.g. switch_user)
    app_user_provider:
        entity:
            class: App\Entity\User
            property: email
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false        
    api:
        pattern: ^/api/
        stateless: true
        entry_point: jwt
        json_login:
            check_path: /api/authentication_token
            provider: app_user_provider                
            username_path: email
            password_path: password
            success_handler: lexik_jwt_authentication.handler.authentication_success
            failure_handler: lexik_jwt_authentication.handler.authentication_failure  
        jwt: ~
        refresh_jwt:
            check_path: /api/authentication_refresh    
            provider: app_user_provider                
    main:
        jwt: ~
Run Code Online (Sandbox Code Playgroud)

-- 路线.yaml

json_login:
    path: /api/authentication_token

refresh_token:
    path: /api/authentication_refresh 
Run Code Online (Sandbox Code Playgroud)

-- gesdinet_jwt_refresh_token.yaml

gesdinet_jwt_refresh_token:
    refresh_token_class: App\Entity\RefreshToken
Run Code Online (Sandbox Code Playgroud)

小智 7

我找到了解决你问题的方法。您需要删除 App/Entity/RefreshToken 文件,然后使用 Symphony CLI 并运行

symfony console make:entity // or php bin/console ...
Run Code Online (Sandbox Code Playgroud)

将实体命名为 RefreshToken 并且不添加任何属性

然后删除刚刚创建的存储库类并进入文件 App/Entity/RefreshToken 使其看起来像这样:

<?php

namespace App\Entity;

use Gesdinet\JWTRefreshTokenBundle\Entity\RefreshToken as BaseRefreshToken;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
#[ORM\Table(name: "refresh_tokens")]
class RefreshToken extends BaseRefreshToken
{

}
Run Code Online (Sandbox Code Playgroud)

你现在可以

symfony console make:migration 
Run Code Online (Sandbox Code Playgroud)

然后

symfony console d:m:m
Run Code Online (Sandbox Code Playgroud)

当您 ping 登录路由时,它应该会像魅力一样发挥作用

编辑:

您的 security.yaml 防火墙应如下所示:

firewalls:

        dev:
            pattern: ^/_(profiler|wdt)
            security: false

        main:
            pattern:  ^/login
            stateless: true
            provider: app_user_provider
            json_login:
                provider: app_user_provider
                check_path: /login
                username_path: email
                password_path: password
                success_handler: lexik_jwt_authentication.handler.authentication_success
                failure_handler: lexik_jwt_authentication.handler.authentication_failure
            logout:
                path: /logout
            
    
        api:
            pattern: ^/api
            stateless: true
            provider: app_user_provider
            jwt: 
                provider: app_user_provider
                authenticator: lexik_jwt_authentication.security.jwt_authenticator
        
        api_token_refresh:
            pattern: ^/token/refresh
            stateless: true
            refresh_jwt: ~
Run Code Online (Sandbox Code Playgroud)