2012-03-11 38 views
8

Tôi đang làm việc trên một hệ thống đăng nhập tương đối đơn giản cho Symfony2.Đăng nhập tùy chỉnh bằng thông số thứ ba

Tôi có những điều cơ bản xuống và làm việc tốt.

Điều gì làm cho này một chút đặc biệt là tôi cần một cách để cung cấp một giá trị thứ ba (một giá trị hệ sinh thái). Tên người dùng trong cơ sở dữ liệu của tôi không phải là duy nhất trên riêng của họ, nhưng làm cho các cặp duy nhất có giá trị hệ sinh thái.

Giá trị hệ sinh thái được cung cấp bởi các hình thức mà họ đăng nhập vào từ.

Làm thế nào tôi có thể sử dụng giá trị hệ sinh thái này được đưa vào xem xét khi thực hiện một tên đăng nhập?

Trả lời

6

Hãy xem hướng dẫn Cookbook theo số How to load Security Users from the Database (the Entity Provider) - cụ thể là một phần về Authenticating Someone with a Custom Entity Provider.

phần này sẽ giải thích làm thế nào để thay đổi/tạo ra một UserProviderInterface để cho phép đăng nhập thông qua một địa chỉ e-mail hoặc tên người dùng. Rõ ràng, đây không phải là những gì bạn muốn, nhưng - nó sẽ là tương đối tầm thường để sửa đổi mã để cũng truy vấn/xác nhận đối với tham số đăng nhập thứ 3 của bạn.

Lý tưởng nhất, bạn sẽ thử nghiệm muốn tạo UserProvider của riêng bạn và may mắn thay, có hướng dẫn về sách dạy nấu ăn chỉ dành cho: How to create a custom User Provider.


Cập nhật: Để có tùy chọn đăng nhập 3rd xử lý và thông qua các nhà cung cấp tùy chỉnh của bạn (tạo ở trên), bạn cũng sẽ cần phải tạo ra một nhà cung cấp tùy chỉnh Authentication. Hãy xem bài viết về nấu ăn (chưa một) khác trên How to create a custom Authentication Provider. Bài viết này được thiết kế để xử lý các tham số tiêu đề yêu cầu bổ sung để xác thực, nhưng sử dụng ví dụ này, bạn sẽ có thể hoán đổi các tiêu đề yêu cầu cho các giá trị POST yêu cầu.

Sử dụng bài viết về sách nấu ăn để hiểu cách xác thực với Symfony2, nhưng sử dụng (và mở rộng) chức năng tên người dùng/mật khẩu của Symfony2 và chỉ bao gồm thông số thứ 3 của bạn. Một số lớp học để xem xét:

+0

Tôi đã có cả hai ứng dụng được triển khai. Điều tôi không thể hiểu là làm thế nào để có được giá trị thứ ba vào kho lưu trữ của tôi để xác nhận nó. – samanime

+0

@samanime: Tôi đã cập nhật câu trả lời của mình, tôi hy vọng nó cung cấp một số trợ giúp! Nếu bạn không làm gì khác, hãy xem và bắt chước lớp 'UsernamePasswordFormAuthenticationListener' mà tôi đã đăng liên kết tới. Chúc may mắn! – leek

+0

Vâng, đó là rất nhiều công việc nhưng cuối cùng tôi đã nhận nó. Tôi đã phải triển khai trình nghe xác thực của riêng mình, Nhà cung cấp xác thực, mã thông báo và nhà máy. Tôi đã mở rộng phiên bản UsernamePassword cho hầu hết trong số chúng, vì vậy tôi không phải thực hiện lại những thứ bảo mật mà nó đã có sẵn. Tôi cũng không thể tìm được cách để nhận giá trị thứ hai vào một EntityRepository, vì vậy tôi phải chuyển một mảng trong tham số đầu tiên để có được những gì tôi cần trong đó. Không lý tưởng, nhưng nó hoạt động. – samanime

0

Bạn có thể tạo tùy chỉnh Password Authenticator (> = Symfony 2.6) và thiết lập các thuộc tính đó:

  1. createToken(): Tạo mã thông báo (bạn có thể sử dụng UsernamePasswordToken) và đặt thuộc tính cho i t, lấy dữ liệu cần thiết từ $ request.
  2. authenticateToken(): Tại đây bạn làm điều gì đó với biến thứ 3 này ($ token-> getAttribute()). Nếu nó ảnh hưởng đến loadUserByUsername đọc dưới đây.

Trong authenticateToken() bạn có UserProvider và loadUserByUsername. Những gì tôi đã làm là sử dụng my user provider (mở rộng FOSUserBundle và ghi đè phương thức đã nói) và chuyển một mảng tới đó bằng tên người dùng và dữ liệu cần thiết khác. Đừng quên kiểm tra những gì được truyền bên trong loadUserByUsername (ví dụ: nếu đó là một chuỗi, sau đó gọi parent :: loadUserByUsername).

Tôi chắc chắn rằng mẹo này với loadUserByUsername là xấu, nhưng tôi không biết làm thế nào khác nó có thể được thực hiện.

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