2012-03-07 32 views
10

Trong ứng dụng Yii của tôi, tôi muốn phân cấp ủy quyền và quy tắc kinh doanh được viết bằng mã và tôi muốn người dùng, vai trò và quyền được lưu trữ trong cơ sở dữ liệu của mình. Điều này tách logic kinh doanh của tôi (mà nên được mã) từ các thông tin nó nên sử dụng (mà nên được dữ liệu). Có vẻ như Yii không ủng hộ điều này.Lý do có quy tắc ủy quyền trong cơ sở dữ liệu là gì?

Trong Yii, bạn có tùy chọn đưa logic nghiệp vụ của mình vào tệp (CPhpAuthManager) hoặc vào cơ sở dữ liệu (CdbAuthManager). Dù bằng cách nào, bạn đang xử lý logic nghiệp vụ của mình dưới dạng dữ liệu; Yii sẽ thực sự truy xuất logic nghiệp vụ của bạn dưới dạng chuỗi và sau đó chạy nó qua một số eval, điều này có vẻ như là một cách khủng khiếp để thực hiện điều này.

Lý do cho việc này là gì?

Tôi có thể đạt được kết quả như thế nào?

Trả lời

2

Bạn có thể đặt nhiều logic như bạn muốn vào mã PHP cho logic nghiệp vụ của mình. Yii hỗ trợ nhiều cách để thêm logic này, ví dụ: LoginForm.php, UserIdentity.php, SiteController.php, ... bạn không bị giới hạn ở đây.

Điều Yii cũng hỗ trợ là thêm đoạn mã logic vào RBAC của bạn. Một trường hợp sử dụng phổ biến là, bạn chỉ định hai quy tắc 'Đã xác thực' và 'Khách' cho tất cả người dùng của trang web của bạn theo mặc định, nhưng với bizRules. Trong khi 'Authenticated' có bizRule như

return !Yii::app()->user->isGuest; 

'Khách' có

return Yii::app()->user->isGuest; 

Kết quả là, bạn đăng nhập người dùng không còn 'Khách' nhưng 'Authenticated'. Một ví dụ khác sẽ được chỉnh sửa quan điểm cho hồ sơ người dùng, mà chỉ có thể chỉnh sửa bằng cách sử dụng hiện nay, như

return $model->id === Yii::app()->user->id; 
+0

Bạn có thể giải thích điều này tốt hơn không? Tại sao bizRules nên ở trong cơ sở dữ liệu, tại sao không đặt chúng trong mã của bạn? –

+0

Như đã đề cập ở trên ... bạn có thể di chuyển logic của mình sang mã PHP, các tình huống trên mô tả trường hợp sử dụng với Vai trò được giao hàng loạt (hoặc Nhiệm vụ hoặc Hoạt động). Nếu bạn checkAccess() một mục như 'CanEditOwnPost', bạn sẽ phải kiểm tra xem bài đăng * current * có thuộc về người dùng hay không, điều này không thể được thực hiện với mục nhập 'tĩnh'. Hoặc làm kiểm tra trong mã PHP và gán mục sau đó ... hoặc thêm một bizRule vào cơ sở dữ liệu của bạn mà không kiểm tra này cho bạn. – schmunk

+0

Nó vẫn không có ý nghĩa như mã trong cơ sở dữ liệu được đánh giá. Sẽ tốt hơn nếu điều này nằm trong bộ điều khiển hay gì đó. –

1

Tại sao bạn sẽ đặt bất cứ điều gì trong một cơ sở dữ liệu vs mã?

Một lý do chính đáng là để những người không phải là nhà phát triển có thể chỉnh sửa nó.

Trong ứng dụng của chúng tôi, chúng tôi cho phép người dùng quản lý quyền của họ trên người dùng và các mục của riêng họ.

Bạn không phải sử dụng quy tắc kinh doanh rbac của yii. Bạn có thể cho phép nói một vài vai trò và nhiệm vụ khác nhau, và có phần còn lại của logic auth trong mã.

+1

Ý tưởng rằng mã chỉnh sửa không phát triển không có ý nghĩa nhiều như một đối số. – hakre

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