Использование LexikJWTAuthenticationBundle с провайдером LDAP - PullRequest
0 голосов
/ 30 января 2020

У меня есть проект, который использует Symfony API-Platform. Я хочу использовать LexikJWTAuthenticationBundle в моем проекте, но мои пользователи хранятся в Active Directory, поэтому я установил LDAP UserProvider. Я попытался объединить настройки двух следующих документов без успеха:

Вот что я сделал

В security.yml:

security:
    providers:
        my_ldap:
            ldap:
                service:     Symfony\Component\Ldap\Ldap
                base_dn:     OU=organization_unit,DC=domain,DC=local
                search_dn:   "OU=organization_unit,DC=domain,DC=local"
                search_password: '%env(resolve:LDAP_PASSWORD)%'
                default_roles: ROLE_USER
                uid_key: uid
firewalls:
    login:
        pattern:  ^/api/login
        stateless: true
        anonymous: true
        json_login:
            provider: my_ldap
            check_path:               /api/login_check
            success_handler:          lexik_jwt_authentication.handler.authentication_success
            failure_handler:          lexik_jwt_authentication.handler.authentication_failure

    api: 
        pattern:   ^/api/
        stateless: true
        guard:
            provider: my_ldap
            authenticators:
                - lexik_jwt_authentication.jwt_token_authenticator

В services.yml:

Symfony\Component\Ldap\Ldap:
    arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter']
Symfony\Component\Ldap\Adapter\ExtLdap\Adapter:
    arguments:
        -   host: '%env(resolve:LDAP_HOST)%'
            port: 636
            # encryption: tls
            options:
                protocol_version: 3
                referrals: false

Но когда я пытаюсь отправить запрос my_domain / api / login_check со следующим содержимым:

{
  "username": "my_user",
  "password": "my_password"
}

Я получил эту ошибку как ответ:

{"code":401,"message":"Invalid credentials."}

1 Ответ

0 голосов
/ 10 марта 2020

Я решил свою проблему с помощью специального действия, которое проверяет, существует ли пользователь с использованием LDAP, и получает его роли. Затем, если только что полученный пользователь имеет право использовать приложение, я создаю новый токен и возвращаю его в ответе. И, наконец, токен используется для аутентификации пользователя при каждом вызове API.

Вот мой security.yml

providers:
    # provider to retrieve user from LDAP
    my_ldap:
        id: App\Security\LdapService
    # provider to retrieve user from user
    jwt:
        lexik_jwt:
            class: App\Security\User
firewalls:
    login:
        pattern:  ^/api/login
        stateless: true
        anonymous: true
api: 
        pattern:   ^/api/
        stateless: true
        guard:
            provider: jwt
            authenticators:
                - lexik_jwt_authentication.jwt_token_authenticator

Действие входа в систему в контроллере:

/**
 * @Route("/api/login", name="api_login", methods={"POST"})
 */
public function loginCheck(Request $request, LdapService $ldapService, AuthenticationSuccessHandler $authenticationSuccessHandler, AuthenticationFailureHandler $authenticationFailureHandler){
    $content = json_decode($request->getContent());
    $response= new JsonResponse();
    try{
        $user=$ldapService->authenticate($content->username, $content->password);
        return $authenticationSuccessHandler->handleAuthenticationSuccess($user);
    }catch(AuthenticationException $e){
        return $authenticationFailureHandler->onAuthenticationFailure($request, $e);
    }        
    return $response;    
}
...