Nhà cung cấp xác thực tùy chỉnh Symfony2 của tôi bây giờ appears to be working.Nhà cung cấp người dùng thực thể Symfony2 ghi đè nhà cung cấp xác thực tùy chỉnh
Provider tài
Tôi gần như sử dụng FOSUserBundle nhưng tôi thậm chí không có địa chỉ email cho người dùng của tôi và tôi không cần thêm chức năng hoặc biến chứng.
Vì vậy, thay vào đó, tôi chỉ sử dụng entity provider.
tôi đặt encoder của tôi để rõ vì các thư viện client API xử lý đó đối với tôi, nhưng than ôi, trở ngại khác: nó có vẻ như Người dùng hiện nay đang được chứng thực chống lại những hồ sơ tài.
Trước khi triển khai nhà cung cấp dịch vụ người dùng, biểu mẫu đăng nhập của tôi đã cung cấp cho tôi phản hồi hợp lệ: thông tin xác thực không mang lại lỗi, thông tin đăng nhập xấu dẫn đến "lỗi người dùng/lỗi không chính xác" tùy chỉnh của tôi.
Bây giờ, ngay cả khi tôi cung cấp thông tin xác thực tôi biết là chính xác, tất cả những gì tôi nhận được là thông báo lỗi "Thông tin đăng nhập không hợp lệ", as if I'm implementing the UserAuthenticationProvider, nhưng theo hiểu biết tốt nhất của tôi thì không. Nhà cung cấp tùy chỉnh của tôi directly implements the AuthenticationProviderInterface.
Vì vậy, tại thời điểm này, tôi cho rằng tôi đã triển khai không chính xác nhà cung cấp dịch vụ người dùng thực thể, sao cho nó bằng cách nào đó sẽ ghi đè nhà cung cấp xác thực tùy chỉnh của tôi. Cách chính xác để định cấu hình nhà cung cấp người dùng thực thể và nhà cung cấp xác thực tùy chỉnh, cùng một lúc là gì?
tập tin
- /app/config/security.yml
- /src/WordRot/PlayBundle/Security/Authentication/Provider/WordnikProvider.php
phần có liên quan củasecurity.yml
encoders:
WordRot\PlayBundle\Entity\User: plaintext
providers:
wordnik_users:
entity: { class: WordRotPlayBundle:User, property: username }
firewalls:
wordnik_secured:
pattern: ^/play
logout: ~
anonymous: ~
# The next line specifies the custom authentication provider:
wordnik: true
form_login:
provider: wordnik_users
login_path: /login
check_path: /play_check
# on success
always_use_default_target_path: true
default_target_path: /play
EDIT
This might prove useful. Đó là một diff trên cành bậc thầy ...
- Từ khi các nhà cung cấp tùy chỉnh auth (WordnikProvider) vẫn bị hành quyết (a473d354)
- Để gần đây nhất cam kết về chi nhánh tổng thể (ddcfeae2) , nơi nhà cung cấp auth không còn được thực thi nữa.
EDIT 2
Với điểm break tôi càng phát hiện ra:
- On đăng nhập dạng POST, WordnikProvider#supports đang được gọi với một UsernamePasswordToken, do đó trở
false
. - Trên biểu mẫu đăng nhập POST,
WordnikListener
được xây dựng nhưng các phương pháp khác (attemptAuthentication
,requiresAuthentication
) không bao giờ được gọi. Chưa hết,WordnikFactory#createListener
cũng không bao giờ được gọi! Thật ngạc nhiên khi người nghe được xây dựng. - Tuy nhiên, trên
login_check
GET,WordnikListener#requiresAuthentication
IS được gọi.
Dịch vụ form_login giả định bạn cần mật khẩu. Vì vậy, làm cho mình một bộ mã hóa mà nói rằng không có mật khẩu là tốt. Điều đó sẽ giúp bạn có thêm một bước nữa. – Cerad
Cerad, thực sự có vẻ như vấn đề đến từ UserAuthenticationProvider, là "Thông tin đăng nhập không hợp lệ". lỗi cho thấy. Mặc dù nó là một bí ẩn hoàn toàn đối với tôi tại sao nhà cung cấp đó đang được nạp! Tôi không nghĩ bộ mã hóa là vấn đề. –
AuthProvider tải người dùng qua nhà cung cấp người dùng và sau đó xác thực người dùng bằng cách kiểm tra mật khẩu bằng bộ mã hóa. Nếu bạn không sử dụng dịch vụ form_login thì hãy lấy nó ra. Nhưng nó chắc chắn có vẻ như/play_check đang được xử lý bởi trình xử lý auth mặc định. – Cerad