LexikJWTAuthenticationBundle与多个提供程序 - php

我是应用程序的2部分-首先是管理员(管理面板),第二个是API。
对于API,我想使用其他模型来检查凭据并检索令牌。
我认为可以通过指定的check_path路由来实现,在该路由中,我可以验证提供的数据,然后手动返回令牌。

但是似乎该应用程序没有事件转到该端点,因为我还没有从响应中看到任何调试消息-仅401错误代码。
这是我的security.yml配置:

security:
    encoders:
        App\Entity\Security\AdminUser:
            algorithm: bcrypt
        Lexik\Bundle\JWTAuthenticationBundle\Security\User\JWTUser:
            algorithm: bcrypt

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email
    jwt:
        lexik_jwt: ~

firewalls:
    api:
        provider: jwt
        pattern:  ^/api/
        stateless: true
        anonymous: true
        guard:
            authenticators:
                - 'jwt.token.authenticator'
        json_login:
            check_path: api.v1.0.token.get
            username_path: passwordName
            success_handler: lexik_jwt_authentication.handler.authentication_success
            failure_handler: lexik_jwt_authentication.handler.authentication_failure
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
        context: 'main'
        pattern: ^/
        form_login:
            provider: fos_userbundle
            default_target_path: easyadmin
            csrf_token_generator: security.csrf.token_manager

        logout:       true
        anonymous:    true


access_control:
    - { path: ^/api/doc, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api/v1.0/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api,       roles: IS_AUTHENTICATED_FULLY }

这是我尝试调试的操作:

class TokenController extends AbstractController
{
/**
 * @Route("/login", name="api.v1.0.token.get", methods={"POST"})
 * @param Request $request
 */
public function obtainToken(Request $request, JWTEncoderInterface $encoder, SiteRepository $siteRepository)
  {
      dd(123); // I don`t see this message - only 401 error

  }
}

参考方案

首先,我不确定您要如何使用yieldToken函数,但是如果您需要以编程方式创建令牌或在返回令牌之前对其进行操作/自定义其内容,我强烈建议您先阅读其文档因为您将拥有实现所需要做的所有工具:

here for the customization through events
here for manual creation

否则,捆绑包将为您处理。

现在,假设您只想使用JWT保护api,则需要将api防火墙分为两个不同的防火墙:

首先登录,如下所示:

login:
  pattern: ^/api/login
  stateless: true
  anonymous: true
  json_login:
    check_path: /api/login_check
    success_handler: lexik_jwt_authentication.handler.authentication_success
    failure_handler: lexik_jwt_authentication.handler.authentication_failure

并且不要忘记更新访问控制以确保您的用户可以匿名访问它:

- { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }

这将允许您使用凭据来打入/ api / login_check以进行身份​​验证并获取您的令牌。

然后,通过定义JWT Guard身份验证器来保护其余的公共api,如下所示:

api:
  pattern: ^/api
  stateless: true
  # /!\ shouldn't be anonymous: true here
  provider: jwt
  guard:
    authenticators:
    - lexik_jwt_authentication.jwt_token_authenticator

以及访问控制:

- { path: ^/api, roles: IS_AUTHENTICATED_FULLY }

如果需要创建帐户,则可以定义自己的路线,并在成功后以编程方式创建令牌。

需要提及的其他事项:

check_path: api.v1.0.token.get:我实际上从未尝试过,但我不认为您可以像这样通过其路由名定义路径,最好直接指定路径。
username_path: passwordName:在这里,您告诉捆绑包使用“ passwordName”作为用户名,这听起来很奇怪。

如果要同时为用户名和密码指定自定义标识符,则最好使用以下方法:

username_path: email # (or whatever field you use for the authentication)
password_path: password

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

PHP-如何获取类的成员函数列表? - php

如果我知道班级的名字。有没有办法知道类的成员函数列表? 参考方案 get_class_methods()是你的朋友

PHP-我们应在会话中包含哪些数据? - php

这是一个初学者的问题...在网站中,会话中应该包含或不应该包含什么类型的数据?我了解我不应该包含任何需要保持安全的信息。我对编程最佳实践更感兴趣。例如,有可能在会话中包括一些数据,否则这些数据将作为依赖项注入从一个页面发送到另一个页面。这不等于创建全局变量吗?一般来说,哪种数据在会话表中已经存在或没有?谢谢,JDelage 参考方案 您应该将会话视为一次写入…

php ziparchive类源代码 - php

Improve this question 我如何获取ziparchive类本身的源代码。 参考方案 假设您在谈论PHP ZipArchive class:下载PHP source code并查找适当的文件。如果您希望源代码是PHP代码,您可能会感到失望,因为源代码是用C语言编写的。或者,也可以在PHP Github Development Reposito…

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…