2015-12-18 16 views
7

Tôi đang cố gắng sử dụng LdapUserProvider mới trong Symfony 2.8. Tôi tin rằng tôi đã định cấu hình mọi thứ per the docs.Xác thực LDAP với Symfony 2.8

Người dùng của tôi có thể xác thực thành công và sau đó được chuyển hướng đến trang được bảo mật. Sau khi chuyển hướng là nơi bắt đầu vấn đề. Symfony cố gắng ràng buộc với tư cách là người dùng đã được xác thực, nhưng với một mật khẩu rỗng, nó bị từ chối bởi ldap mở.

Dưới đây là các mục nhập nhật ký và giá trị cấu hình có liên quan.

Config:

services: 
    app.ldap: 
     class: Symfony\Component\Ldap\LdapClient 
     arguments: [ "localhost" ] 

An ninh:

security: 
    firewalls: 
     restricted_area: 
      provider: app_users 
      form_login_ldap: 
       service: app.ldap 
       dn_string: "uid={username},DC=mydomain,DC=net" 
       check_path: login_check 
       login_path: login 
    providers: 
     app_users: 
      ldap: 
       service: app.ldap 
       base_dn: dc=mydomain,dc=net 
       search_dn: cn=Manager,DC=mydomain,DC=net 
       search_password: secretPassword 
       filter: "(&(aptAccountEnabled=1)(ObjectClass=aptAccount)(uid={username}))" 
       default_roles: ROLE_USER 

Và các log file:

[2015-12-18 13:55:11] request.INFO: Matched route "login_check". {"route_parameters":{"_route":"login_check"},"request_uri":"http://ancdev.admin.aptalaska.net/~dmorphis/Portal/web/app_dev.php/Login/Verify"} [] 
[2015-12-18 13:55:11] security.DEBUG: Read existing security token from the session. {"key":"_security_restricted_area"} [] 
[2015-12-18 13:55:11] security.DEBUG: User was reloaded from a user provider. {"username":"dan.smartrg","provider":"Symfony\\Component\\Security\\Core\\User\\LdapUserProvider"} [] 
[2015-12-18 13:55:26] security.INFO: User has been authenticated successfully. {"username":"dan.smartrg"} [] 
<snip> 
[2015-12-18 13:55:26] security.DEBUG: Stored the security token in the session. {"key":"_security_restricted_area"} [] 
<snip> 
[2015-12-18 13:55:27] request.INFO: Matched route "home.index". {"route_parameters":{"_controller":"Apt\\PortalBundle\\Controller\\DefaultController::indexAction","_route":"home.index"},"request_uri":"http://ancdev.admin.aptalaska.net/~dmorphis/Portal/web/app_dev.php/"} [] 
[2015-12-18 13:55:28] security.DEBUG: Read existing security token from the session. {"key":"_security_restricted_area"} [] 
[2015-12-18 13:55:28] security.DEBUG: User was reloaded from a user provider. {"username":"dan.smartrg","provider":"Symfony\\Component\\Security\\Core\\User\\LdapUserProvider"} [] 
[2015-12-18 13:56:15] php.DEBUG: ldap_bind(): Unable to bind to server: Server is unwilling to perform {"type":2,"file":"/home/dmorphis/public_html/Portal/vendor/symfony/symfony/src/Symfony/Component/Ldap/LdapClient.php","line":73,"level":28928} [] 
[2015-12-18 13:56:15] app.ERROR: Bad credentials. [{"file":"/home/dmorphis/public_html/Portal/app/cache/dev/classes.php","line":2697,"function":"authenticate","class":"Symfony\\Component\\Security\\Core\\Authentication\\Provider\\UserAuthenticationProvide <truncated> 
[2015-12-18 13:56:15] security.INFO: An AuthenticationException was thrown; redirecting to authentication entry point. 
+0

Các tài liệu nói để sử dụng Symfony \ Component \ Security \ Ldap \ Ldap, nhưng tài liệu sai. Lớp thực tế là Symfony \ Component \ Ldap \ LdapClient –

+1

Điều này có vẻ khá nghiêm trọng. Có thể mở một vấn đề trên GitHub về nó? (nó có cách hiển thị nhiều hơn ở đó) –

Trả lời

0

Trong Symfony 3.1, thành phần LdapClient không được chấp nhận. Vì vậy, tôi muốn cập nhật giải pháp. Giải pháp này cũng sẽ làm việc cho các ứng dụng Symfony 2.8/2.9.

#security.yml 
security: 
    firewalls: 
     restricted_area: 
      provider: app_users 
      form_login_ldap: 
       service: ldap.auth 
       dn_string: "%dn_string%" 

    providers: 
     app_users: 
      ldap: 
       service: ldap.auth 
       base_dn: "dc=domain,dc=net" 
       search_dn: "cn=Manager,DC=domain,DC=net" 
       search_password: secretPassword 
       filter: "(&(aptAccountEnabled=1)(ObjectClass=aptAccount)({uid_key}={username}))" 
       default_roles: ROLE_USER 
       uid_key: uid 

#services.yml 
services: 
    ldap.auth: 
     class: 'Symfony\Component\Ldap\Ldap' 
     factory: 
      - 'Symfony\Component\Ldap\Ldap' 
      - 'create' 
     arguments: 
      - 'ext_ldap' # adapter 
      - 
       host: database 
       options: 
        protocol_version: 3 
0

tôi đã gần như chính xác cùng một vấn đề. Sau khi gỡ lỗi mãnh liệt, tôi đến dòng:

trong \Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::__construct:

parent::setAuthenticated(count($roles) > 0); 

Đây là một vấn đề, bởi vì tôi được chẩn đoán, rằng UsernamePasswordToken đang đến được xác thực từ lưu trữ phiên để bắt đầu với. Điều này là do không có vai trò nào được chỉ định do ghi đè tùy chỉnh các dịch vụ mặc định của tôi.

Thông thường, LDAP sẽ chỉ được gọi một lần khi đăng nhập và không có mật khẩu nào được lưu trữ trong phiên. Chỉ authenticated = true trong mã thông báo được tuần tự hóa.

Bạn có chắc là bạn đang nhận được mã xác thực chưa được xác thực không?

4

Cuối cùng tôi đã tìm thấy vấn đề là gì.

Bạn phải chuỗi các UserProvider:

chain_provider: 
    chain: 
      providers: [in_memory, app_users] 
    in_memory: 
     memory: ~ 
    app_users: 
     ldap: 
      .....</i> 
+0

thêm các dòng nhà cung cấp ở trên cho tôi một lỗi trên symfony 2.8 – Christian

+0

đánh dấu là một chút bị hỏng, ở đây: http://symfony.com/doc/2.8/security/multiple_user_providers.html – ahinze

1

tôi đã cùng một vấn đề. Trong trường hợp của tôi cấu hình sai của framework.session.handler_id - Tôi đã phải thay đổi nó từ trình xử lý tệp gốc thành null, đây là trình xử lý phiên làm việc mặc định của PHP.

Các vấn đề liên quan