2010-06-29 26 views
7

Tôi cảm thấy một chút mâu thuẫn vào lúc này. Tôi có một ứng dụng web bằng cách sử dụng Stripes cho một khung MVC và Spring/Hibernate cho back-end. Tôi có một phương pháp đăng ký tài khoản trong lớp MVC của tôi mà đòi hỏi sự xác nhận sau:Tôi có nên nhân đôi xác thực trong lớp MVC và lớp Dịch vụ của mình không?

  • Tên đăng nhập chưa được lấy
  • Địa chỉ email được cung cấp chưa được kết hợp với tài khoản khác

Tôi có một phương pháp xác nhận trong Stripes (lớp MVC) để kiểm tra hai trường hợp này nhưng đã tự hỏi liệu lớp dịch vụ của tôi có nên lặp lại các kiểm tra này không? Nếu giao diện tầng dịch vụ được hiển thị như một dịch vụ web thì tôi nghĩ việc xác thực sẽ là một ý tưởng hay, nhưng nếu nó chỉ được sử dụng trong ngữ cảnh của một ứng dụng web thì nó có cần thiết không?

Chỉnh sửa: Tôi không định lặp lại mã xác thực - nghĩa là sao chép cuộc gọi phương thức xác thực ở hai nơi.

tôi thấy lựa chọn của tôi là:

  1. Duplicate các cuộc gọi xác nhận trong cả hai MVC và lớp dịch vụ
  2. Chỉ thực hiện xác nhận này trong lớp MVC
  3. Chỉ thực hiện xác nhận này trong lớp dịch vụ.

Thực tiễn nào tốt nhất ở đây? Tôi đang tìm kiếm lời khuyên/ý kiến ​​về lựa chọn nào tôi nên đi cùng và tại sao. Lưu ý rằng có kiểm tra xác thực đơn giản trên các trường nhập của biểu mẫu đăng ký (như kiểm tra khoảng trống) và tôi cho rằng những điều này chỉ được xử lý bằng xác thực MVC; Tôi chỉ quan tâm đến việc xác thực phức tạp hơn.

Trả lời

1

Annie,

Câu hỏi hay, tôi đã tự hỏi mình nhiều lần trong nhiều trường hợp. Đây là những gì tôi đã kết thúc với (cho đến bây giờ).

Cách tiếp cận tinh khiết nhất (nhưng tẻ nhạt) là gọi logic xác thực trong cả hai lớp. cách tiếp cận thực dụng có thể là chỉ gọi nó trong web-land (ví dụ: bộ điều khiển của bạn).

Tôi nghĩ rằng không có câu trả lời nào kết thúc tất cả các cuộc thảo luận. Tôi nghĩ rằng nó phụ thuộc vào bối cảnh của dự án của bạn. Nếu kích thước dự án là khiêm tốn (về con người và kích thước của codebase) và bạn tự tin rằng không phải toàn bộ mã sẽ được phát triển bởi những người khác gọi API dịch vụ của bạn (đến mức bạn sẽ không thể giám sát được)), sau đó thực hiện xác thực trong lớp web chỉ có thể đủ.

Tuy nhiên, nếu bạn mong đợi nhiều khách hàng, bạn có thể cần bảo mật cấp cao hơn. Khi tôi nói bảo mật ở đây, tôi gọi nó là mức độ bảo đảm nhất quán mà bạn cần. Nếu mức đó cao, không có cách nào xung quanh nó: bạn sẽ phải thực hiện trong cả dịch vụ (bảo mật) và lớp web (chủ yếu để có thể cung cấp cho người dùng cuối trải nghiệm có thể chấp nhận được).

Vì vậy, trình điều khiển chính ở đây là bảo mật và số tiền bạn thực sự cần. Nếu bạn cần rất nhiều, bạn đi theo phương pháp 'thuần túy'. Nếu ứng dụng của bạn không chính xác đưa ra quyết định liên quan đến các vấn đề của cuộc sống và cái chết, bạn hãy đi theo cách tiếp cận thực dụng.

5

Không trùng lặp mã. Sử dụng JSR303 Bean Validation để bạn có thể sử dụng cùng một logic xác thực trong tất cả các lớp trong ứng dụng của mình.

Hibernate Validator (một dự án riêng biệt từ các công cụ ORM Hibernate) cung cấp triển khai tham chiếu của giao diện này. Nó rất dễ sử dụng, bạn có thể get started with it very quickly.

+0

Đúng, tôi không có nghĩa là tôi sẽ sao chép mã xác nhận - nghĩa là tôi sẽ gọi cùng một mã xác nhận ở hai nơi – JMM

+0

Như bạn đã đề cập, bạn thực sự cần phải xác thực hai lần, trường hợp bạn có các máy khách khác ngoài lớp điều khiển. Có khả năng tôi có thể thấy khả năng muốn có logic xác thực khác nhau –

1
  1. Một cách lý tưởng, thực hiện xác nhận trong cả hai lớp, từ lớp dịch vụ của bạn có thể được sử dụng với một khách hàng khác với lớp MVC hiện

  2. Tái sử dụng cơ chế xác nhận tại cả hai nơi (Bean xác nhận, ví dụ)

3

Theo tôi bạn nên diferenciate hai loại vụ việc phê chuẩn:

  • Xác nhận hợp lệ dữ liệu định dạng: Nên xác nhận hợp lệ trong lớp trình bày (MVC trong trường hợp của bạn). Thông thường cả về khách hàng và phía máy chủ
  • Các Bussines xác nhận dữ liệu: Những nên được xác nhận trong các lớp dịch vụ

Trong trường hợp của bạn hợp lệ của bạn có liên quan đến quy tắc kinh doanh, vì vậy tôi sẽ đặt chúng chỉ trong lớp dịch vụ. Ngoài ra, nếu bạn sao chép xác thực trong cả hai lớp, bạn sẽ thực hiện cùng một truy vấn hai lần, làm chậm hiệu suất của ứng dụng của bạn.

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