在我的 api 中,我尝试使用LdapToolsBundle、FOSUserBundle和LexikJWTAuthenticationBundle对用户进行身份验证。一步一步地做事,并遵循fosuser 和 ldaptools 的集成文档以及后来的 jwt 文档,我设法完成了以下操作:
- FosUserBundle + LdapToolsBundle 成功
- Api 集成 + FosUserBundle + LdapToolsBundle 成功
- Api 上的 Jwt + FosUserBundle + LdapToolsBundle 失败。
问题是我只能登录我的数据库,但不能登录 ldap。
在我的数据库中,我有一个使用 fos 命令和任何密码创建的用户记录(使身份验证在 ldap 上而不是 fosuser 上)。到现在为止还挺好。但是一旦引入 JWT,身份验证是由 fosuser 而不是 ldap 身份验证守卫进行的。当我使用 fos 命令更改密码时,我可以毫无问题地获取令牌。
这是我的配置:
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
LdapTools\Bundle\LdapToolsBundle\Security\User\LdapUser: plaintext
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
ldap:
id: ldap_tools.security.user.ldap_user_provider
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
api_login:
pattern: ^/login
stateless: true
provider: fos_userbundle
anonymous: true
form_login:
check_path: /login
require_previous_session: false
username_parameter: username
password_parameter: password
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
require_previous_session: false
guard:
authenticators:
- ldap_tools.security.ldap_guard_authenticator
logout: true
api:
pattern: ^/
stateless: true
lexik_jwt: ~
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, role: IS_AUTHENTICATED_FULLY }
我的问题是我怎样才能使用 ldap 身份验证器?我将展示所需的工作流程
- 收到验证请求(用户名和密码)
- fosuser 提供程序找到用户或未找到用户(错误凭据--> 结束)
- ldap 身份验证器保护针对域服务器或错误凭据对用户进行身份验证 --> 结束
- 用户登录成功,收到token
但我仍然在数据库和域服务器中获得注册用户的错误凭据(用户凭据有效)
提前致谢!