从多个位置对用户进行身份验证的正确位置在哪里?



在我的第一个Symfony 4.4项目中,我需要从数据库中验证用户。不幸的是,在用户登录之前,我需要在远程 API 服务中检查用户状态。如果用户在此服务中处于活动状态,并且凭据与我的数据库中的凭据相同,则可以在我的应用程序中对用户进行身份验证。

在我的应用中进行身份验证之前,检查用户是否处于活动状态的最佳位置在哪里?我需要创建自定义防护?自定义用户提供程序?

我使用 Lexik JWT 身份验证,有我的/config/packages/security.yaml

security:
providers:
app_user_provider:
entity:
class: AppEntityUser
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
authorization:
pattern:  ^/api/v1/auth/
stateless: true
anonymous: true
json_login:
check_path: /api/v1/auth/sign-in/
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
username_path: email
api:
pattern: ^/api/v1/(user|req)/
stateless: true
anonymous: false
provider: app_user_provider
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator

我在 4.1 之后没有使用 Symfony,所以最近情况可能发生了变化。你只需要检查。

在我的应用中进行身份验证之前,检查用户是否处于活动状态的最佳位置在哪里?我需要创建自定义防护?自定义用户提供程序?

用户提供程序就是答案。如果你看一下UserProviderInterface,它说"Internally, a user provider can load users from any source (databases, configuration, web service)."

。在用户登录之前,我需要在远程 API 服务中检查用户状态。如果用户在此服务中处于活动状态,并且凭据与我的数据库中的凭据相同,则可以在我的应用程序中对用户进行身份验证。

因此,您可以做的是满足您的要求:

  • 在你的serurity.yaml中实现一个firewall,并使其使用simple_preauth
  • 实现与simple_preauth. authenticator一起使用的身份验证器类。就身份验证而言,这会将所有内容连接起来。
  • 实现首先调用远程 API 的用户提供程序以检查用户是否处于活动状态,然后再次检查本地数据库,依此类推。

资源:

  • 一切之前,请确保您了解Symfony Auth流程!
  • Symfony中JWT身份验证流的一个示例。
  • 这里有很多与Symfony安全相关的例子。
  • 也看看Symfony安全文档,在那里你会看到关于整个主题的大量信息。

最新更新