Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Yii

Lập trình với Yii2: Xác thực chuyên dụng

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called How to Program With Yii2.
How to Program With Yii2: Validations
How to Program With Yii2: AuthClient Integration With Twitter & Google

Vietnamese (Tiếng Việt) translation by Andrea Ho (you can also view the original English article)

Final product image
What You'll Be Creating

Nếu bạn đang hỏi "Yii là gì?" hãy xem hướng dẫn trước của tôi: Introduction to the Yii Framework để đánh giá các ích lợi của Yii và có cái nhìn tổng thể những cái mới của Yii2, phát hành vào tháng 10 2014.

Trong loạt bài Programming with Yii2, tôi sẽ hướng dẫn người đọc sử dụng framework Yii2 mới được nâng cấp cho PHP. Hướng dẫn này là phần thứ 2, hãy xem Yii2's validators. Validator tối giản hóa code cần thiết để xác thực dữ liệu nhập vào, nghĩa là xác minh sự phù hợp hoặc không phù hợp của dữ liệu, thường là từ người dùng thông qua form trên web. Cụ thể, chúng tôi sẽ khám phá một số tính năng xác thực chuyên môn có sẵn dùng phổ biến cho phát triển web.

Dưới đây là danh sách các trình xác thực Yii có sẵn và liên kết đến tài liệu mà chúng tôi sẽ khám phá:

  • CaptchaValidator: Xác thực một trường của biểu mẫu qua CAPTCHA.
  • CompareValidator: So sánh hai giá trị từ biểu mẫu hoặc một hằng số, ví dụ x phải nhỏ hơn 99.
  • EmailValidator: Đảm bảo giá trị là một email hợp lệ.
  • ExistValidator: Đảm bảo rằng một giá trị tồn tại trong một bảng khác.
  • FileValidator: Đảm bảo sự tồn tại của một file đã được tải lên.
  • ImageValidator: Xác thực các hình ảnh và thuộc tính hình ảnh.
  • RangeValidator: Đảm bảo một giá trị thuộc về danh sách các giá trị.
  • RegularExpressionValidator: Thực hiện xác thực đối với một điều kiện được xác định bởi regular expression.
  • UniqueValidator: Đảm bảo giá trị là duy nhất trong một bảng, chẳng hạn như địa chỉ email.
  • UrlValidator: Đảm bảo giá trị ở định dạng URL, ví dụ: http://yourdomain.com.

Tôi sẽ hướng dẫn bạn thông qua các ví dụ về từng xác nhận hợp lệ này với codebase của ứng dụng Hello từ các hướng dẫn trước đây và một số khác từ loạt bài Building Your Startup. Sử dụng các liên kết GitHub trên trang này để lấy mà nguồn.

Xin nhắc rằng tôi luôn tham gia vào những bình luận bên dưới. Tôi đặc biệt quan tâm nếu bạn có thêm ý tưởng hoặc muốn đề xuất các chủ đề cho bài hướng dẫn tiếp theo. Bạn cũng có thể liên hệ với tôi @reifman trên Twitter hoặc gửi email cho tôi tại Lookahead Consulting.

Trình xác thực là gì?

Nếu bạn là nhà phát triển web, có thể bạn biết rằng dữ liệu vào của người dùng không thực sự an toàn. Ví dụ: người dùng có thể sử dụng các kỹ thuật SQL injection (đánh lừa câu truy vấn) để thử chạy các truy vấn nằm thay đổi hoặc khai thác mật khẩu. Có người từng sử dụng SQL injection với bộ cài đặt mã nguồn mở PHPList của tôi và quản lý để mò tìm các mật khẩu của tôi (PHPList lưu trữ những giá trị này theo kiểu văn bản thuần túy). Thông thường, bạn chỉ muốn chắc rằng dữ liệu mà người dùng cung cấp tuân thủ các kiểu, biểu mẫu và trong phạm vi ứng dụng của bạn.

Việc xây dựng các trình xác thực trong PHP thuần tuý cần nhiều thời gian. Framework Yii cung cấp rất nhiều tính năng xác thực cơ bản nên không cần phải xây dựng từ đầu. Tuy nhiên, nếu bạn cần một số tiện ích mở rộng tùy chỉnh, việc đó cũng đơn giản.

Các xác thực là lý do khác tại sao tôi nghĩ rằng luôn hợp lý khi xây dựng các ứng dụng dựa trên một framework như Yii chứ không phải PHP thuần tuý.

Trong các phần trước, chúng tôi cũng đã nói rất nhiều về Gii - bộ tạo code của Yii. Một trong những lợi ích của Gii là nó sẽ viết các quy tắc xác thực phù hợp cho các model của bạn dựa trên các định nghĩa kiểu SQL trong scheme. Đây là cách rất tiết kiệm thời gian.

Có thể bạn muốn quay ngược về bài viết mới đây để đọc thêm về những kiểu xác thực cơ bản của Yii2.

Bây giờ, chúng ta hãy bắt đầu xem xét những trình xác thực dựng sẵn tiếp theo của Yii2.

Những trình xác thực kế tiếp

Trình xác thực Captcha

Hãy bắt đầu với CaptchaValidator để kiểm tra xem xác thực CAPTCHA có nhận được một phản hồi đúng không. CAPTCHA đảm bảo rằng biểu mẫu do người thật điền vào, và hy vọng ngăn chặn những mã lệnh tự động nằm gửi biểu mẫu đi.

Đây là một ví dụ về Yii Captcha trong thực tiễn:

Yii2 Validators CAPTCHA Validator

Trong codebase Hello, tôi đã đơn giản hóa mẫu biểu mẫu của chúng tôi để chỉ bao gồm các trường Thought và Captcha. Hãy xem các định nghĩa quy tắc dưới đây, dành cho code của model:

Captcha không phải là một phần của database scheme của chúng ta — Captcha chỉ được dùng để xác thực biểu mẫu. Do đó, tôi đã bổ sung một thuộc tính vào model cho nó, ví dụ: public $captcha;

Đây là code cho biểu mẫu. Chúng ta phải chèn thư viện Captcha ở trên cùng.

Xác thực Captcha trong thực tiễn sẽ giống như vậy:

Yii2 Validators Sample CAPTCHA validation error

Nếu bạn nhấp vào Captcha, Yii sẽ tạo ra một hình ảnh mới.

Trình xác thực so sánh

Bây giờ, hãy chuyển sang CompareValidator. Trình xác thực này so sánh hai giá trị từ biểu mẫu hoặc một giá trị duy nhất của một biểu mẫu với một hằng số, chẳng hạn như x phải nhỏ hơn 99.

Trong ví dụ này, tôi muốn đảm bảo rằng dữ liệu do người dùng nhập vào cho thứ hạng trong khoảng từ 0 đến 100.

Đầu tiên, tôi sẽ bổ sung một trường nhập dữ liệu vào biểu mẫu cho thuộc tính xếp hạng:

Sau đó, tôi sẽ thêm hai quy tắc xác thực so sánh vào model của chúng tôi:

Bạn có thể xem danh sách đầy đủ các toán tử so sánh có sẵn tại đây.

Biểu mẫu của ta sẽ trông thế này khi người dùng gửi một thuộc tính không hợp lệ:

Yii2 Validators Compare

Nếu chúng tôi muốn cung cấp các quy tắc ràng buộc cụ thể trong một thông báo lỗi, Trình xác thực của Yii cho phép bạn tùy chỉnh lỗi được hiển thị cho người dùng, giống như vậy:

Yii2 Validators The Compare validator with custom error message

Triển khai việc này khá đơn giản chỉ với việc bổ sung thuộc tính message:

Cập nhật schema của chúng ta để kiểm tra các xác thực khác

Trong một số các kiểm tra xác thực kế tiếp, tôi sẽ yêu cầu bạn bổ sung một số field vào database.

Trong \migrations\m150219_235923_create_sample_table.php, chúng tôi sẽ bổ sung một số field mới để kiểm tra tập hợp các trình xác thực tiếp theo: email, URL, tên tệp, v.v.

Sau đó chạy migration (chuyển dữ liệu) down để xoá bảng và sau đó là migration up:

Bây giờ chúng ta đã sẵn sàng để kiểm tra các trình xác thực email và URL.

Trình xác thực Email và URL

EmailValidator đảm bảo giá trị là địa chỉ email hợp lệ và UrlValidator đảm bảo giá trị ở định dạng URL, ví dụ: http://yourdomain.com.

Việc tạo quy tắc cho các field mới - email và URL, rất đơn giản:

Đây là code cho biểu mẫu. Chú ý cách tôi đang sử dụng nhãn tùy chỉnh để cải thiện khả năng sử dụng cho biểu mẫu:

Dưới đây là các trình xác thực đang trong thực tiễn:

Yii2 Validators The Email and URL Validators

Các trình xác thực rõ ràng là rất hữu ích cho các ứng dụng web.

Trình xác thực tồn tại

ExistValidator cực hữu ích trong các tình huống nhất định. Nó có thể đảm bảo rằng một giá trị tồn tại trong một bảng khác. Và có thể được sử dụng theo nhiều cách khác nhau - dưới đây là một số ví dụ được đưa ra trong tài liệu:

Tài liệu Yii nêu bật rằng Exist có thể được sử dụng để "xác thực một foreign key (khoá ngoại) có chứa giá trị có thể tìm thấy trong foreign table (bảng tham chiếu)."

Trong ví dụ của chúng ta, tôi sẽ tạo một quy tắc để kiểm tra xem địa chỉ email trong biểu mẫu đã tồn tại trong bảng User đã đăng ký của chúng tôi chưa. Để thực hiện điều này, chúng ta sử dụng targetClass để cho Yii biết Class (hoặc bảng Model) nào dùng để tìm kiếm địa chỉ email của người dùng cho việc xác thực.

Dưới đây là định nghĩa quy tắc — hãy chú ý bao gồm User model của chúng tôi ở trên cùng:

Điều đó hướng dẫn Yii truy vấn bảng User để đảm bảo rằng địa chỉ email được cung cấp chính xác với người dùng đã đăng ký trước đó.

Trong thực tế nó trông giống thế này:

Yii2 Validators Exist with Email Lookup

Bạn có thể tìm hiểu thêm về xác thực Exist và các chọn lựa thay thế của nó ở đây.

Trình xác thực file và hình ảnh

Kế tiếp, tôi sẽ cho bạn xem ví vụ của FileValidator, nó bảo đảm một file đã tải lên có tồn tại, kiểu MIME và kích thước file, và ImageValidator để xác thực hình ảnh và thuộc tính của nó.

Để khai thác trình xác thực File và Image, hãy xem ví dụ từ loạt bài Building Your Startup With PHP: User Settings, Profile Images và Contact Details. Model UserSettings trong phần đó, cho phép người dùng tải lên hình ảnh cho hồ sơ của họ.

Thuộc tính hình ảnh nhận file đã tải lên:

FileValidator bảo đảm rằng hình ảnh có phần mở rộng thích hợp và nhỏ hơn 100,000 byte.

ImageValidator cũng xác minh kiểu mở rộng và khoảng chiều cao và chiều rộng cho hình ảnh.

Dưới đây là ví dụ về các lỗi phát sinh khi tải lên hình ảnh có kích thước lớn hơn 400 x 400 pixel:

Yii2 Validators Image and File Validation

Đó là trợ lý của tôi ở trên, người đã từng thích sao chép và chỉnh sửa các hướng dẫn của tôi.

Trình xác thực về phạm vi

Cũng có RangeValidator để bảo đảm rằng một giá trị trong một danh sách của những mục được cho phép nhập.

Trong ví dụ của chúng ta, hãy bổ sung một field dành cho kiểm duyệt trong biểu mẫu:

Sau đó, chúng ta sẽ bổ sung RangeValidator để khớp phản hồi cho một chuỗi yes hoặc no:

Đây là một ví dụ của RangeValidation trong thực tiễn:

Yii2 Validators Range In Validator

Trình xác thực phù hợp với Regular Expression

Tiếp theo, chúng ta hãy xem RegularExpressionValidator để thực hiện xác thực hợp lệ đối với một điều kiện được định nghĩa bởi regular expression.

Trong ví dụ của chúng tôi, tôi đang sử dụng regex bên dưới để tìm kiếm các câu hoàn chỉnh với các ký tự chữ cái. Có nghĩa là chúng phải kết thúc bằng (!, ? hoặc .) và không chứa ký tự số.

Dưới đây là ví dụ về dữ liệu nhập vào từ người dùng mà thoã mản bài kiểm tra bởi vì các con số và thiếu dấu chấm câu:

Yii2 Validator Regular Expression Match Failure

Đây là một câu hợp lệ:

Yii2 Validator Regular Expression Match Success

Bạn cũng có thể quan tâm đến Eight Regular Expression You Should Know (Tuts+) đóng vai trò là một tham chiếu cho các regex pattern phổ biến.

Unique Validator

Cuối cùng, ta hãy xem xét UniqueValidator, nó đảm bảo rằng một giá trị là duy nhất trong một bảng, chẳng hạn như một địa chỉ email hoặc một slug.

Tôi đã xem xét SluggableBehavior trước đó trong loạt bài này, trình xác thực này đề xuất hỗ trợ khả năng tìm giá trị duy nhất được xây dựng riêng cho nó. Tuy nhiên, chúng ta hãy xem qua một vài ví dụ khác từ loạt bài Building Your Startup With PHP.

Trong codebase của Meeting Planner (từ các phần hướng dẫn gần đây) trong model Place (\frontend\models\Place.php), chúng tôi sử dụng trình xác nhận duy nhất theo một số cách:

Đầu tiên, chúng ta sử dụng quy tắc duy nhất với slug để tăng thêm SluggableBehavior, điều này là không cần thiết; nhưng bạn có thể nhìn thấy định dạng xác thực.

Thứ hai, chúng tôi sẽ kiểm tra kết quả của ô tìm kiếm Google Places Autocomplete trong trường bị ẩn đi cho google_place_id là duy nhất, nó vẫn chưa tồn tại trong bảng Places. Về cơ bản, chúng tôi đang ngăn việc trùng lặp Google Place IDs.

Phần quan trọng của điều này là trình xác thực duy nhất của Yii2 cho phép chúng tôi thực thi tính duy nhất trên trường hiển thị (searchbox - ô tìm kiếm) trong khi việc xác thực nó trên cột thứ hai được trả về thông qua AJAX từ Google (google_place_id).

Thứ ba, chúng tôi sẽ đảm bảo rằng namefull_address là cặp giá trị duy nhất. Nói cách khác, các tên địa điểm có thể trùng lặp. Có thể có cả núi tên Starbucks. Tuy nhiên, chúng tôi không muốn bất kỳ ai nhậpcùng một vị trí của Starbucks hai lần.

Lưu ý: Cà phê Starbucks không phải là chất kích thích hữu hiệu cho các nhà phát triển phần mềm. Tôi khuyến khích bạn thường xuyên đến quán cà phê độc lập.

Dưới đây là ví dụ về hành động này:

Yii2 Validators Unique

Kế tiếp là gì?

Tôi hy vọng bạn đồng ý trình xác thực Yii2 đơn giản và hữu dụng cho phát triển web. Tôi chỉ không thể hình dung nếu trở lại phát triển PHP mà không có sự trợ giúp của framework.

Xem các hướng dẫn sắp tới trong loạt bài Programming with Yii2 khi tôi tiếp tục đào sâu vào các khía cạnh khác nhau của framework này. Trong phần tiếp theo, tôi sẽ xem xét các tính năng xác thực nâng cao của Yii2 như:

  • Xác thực có điều kiện để thực hiện quy tắc xác thực chỉ khi đúng với một sự kiện cụ.
  • Trình xác thực tùy biến để tạo các xác thực hợp lệ ngoài những gì Yii đặc biệt đề xuất.
  • Xác thực phía máy khách để tận dụng xác thực có sẵn JavaScript ActiveForm của Yii mà không yêu cầu tải lại trang
  • Xác thực qua AJAX để triển khai xác thực AJAX phía máy chủ để mở rộng khả năng xác thực trang JavaScript phía máy khách của Yii.
  • Sự kiện xác thực để thay thế xác thực hoặc thực hiện chức năng cụ thể trước và/hoặc sau khi xác thực
  • Xác định các kịch bản để áp dụng có chọn lọc quy tắc cho các tình huống nhất định
  • Xác thực Ad Hoc để sử dụng quy tắc xác thực độc lập với việc gửi biểu mẫu

Tôi hoan nghênh các yêu cầu về tính năng và chủ đề. Bạn có thể đăng chúng trong bình luận dưới đây, liên hệ với tôi @reifman trên Twitter, hoặc gửi email cho tôi tại Lookahead Consulting.

Nếu bạn muốn biết khi nào có hướng dẫn tiếp theo về Yii2, bạn cũng có thể xem trang hướng dẫn Tuts+ của tôi. Trang này luôn có các liên kết đến bài viết của tôi ngay sau khi chúng được xuất bản.

Liên kết liên quan

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.