2016-02-26 21 views
8

Xin chào các bạn, tôi đã thấy rất nhiều hướng dẫn về RBAC của Yii 2 nhưng tôi thực sự không thể đánh giá cao cách thực hiện các quy tắc. Trong hướng dẫn Yii 2, họ đã giới thiệu cách thức các quy tắc được thực hiện nhưng không thực sự làm thế nào nó có thể được thực hiện trong hành vi của bộ điều khiển hoặc ở một nơi khác. Tôi thực sự cần một số chứng ngộ về vấn đề này.Thực hiện Quy tắc RBII Yii2

Điều tôi hiện có là hệ thống tải lên tài liệu nơi tôi có hai vai trò là bộ mã hóa quản trị &. Về cơ bản, vai trò quản trị viên có thể thực hiện tất cả trong khi vai trò bộ mã hóa chỉ có thể tạo, xem riêng, cập nhật và xóa riêng. Tôi đã tạo một Rule có tên encodedBy.

Đây là mã của tôi trong EncoderRule tôi

namespace app\rbac; use yii\rbac\Rule; 

/** * Checks if encoded_by matches user passed via params */ class EncoderRule extends Rule { 
    public $name = 'encodedBy'; 

    /** 
    * @param string|integer $user the user ID. 
    * @param Item $item the role or permission that this rule is associated with 
    * @param array $params parameters passed to ManagerInterface::checkAccess(). 
    * @return boolean a value indicating whether the rule permits the role or permission it is associated with. 
    */ 
    public function execute($user, $item, $params) 
    { 
     return isset($params['document']) ? $params['document']->encoded_by == $user : false; 
    } } 

tôi lưu trữ dữ liệu trong bảng 'tài liệu' nơi tôi có một trường có tên là 'encoded_by' Tôi hy vọng bạn guys có thể giúp tôi về vấn đề này. Cảm ơn rất nhiều !!!

+0

Video này thực sự là một công việc tốt để giải thích RBAC cho bất kỳ ai không chắc chắn về cách hoạt động: https://www.youtube.com/watch?v = vLb8YATO-HU – TheStoryCoder

Trả lời

2

Nếu tôi hiểu rõ bạn, bạn muốn sử dụng Quy tắc RBAC Yii2 để thực hiện một số quyền đối với người dùng hệ thống (Quản trị viên và bộ mã hóa). Vâng, điều này khá thẳng về một mức độ nào đó

Yii2 có các bảng hiện có cho mục đích này. Các bảng này là i. auth_assignment ii. auth_item iii. auth_item_child iv. auth_rule

Điều đầu tiên bạn cần làm là chọn mà authManager bạn muốn sử dụng một trong hai PhpManager hoặc DBManager nhưng tôi sẽ tư vấn cho bạn sử dụng DBManager lý do là, nó là những gì tôi sử dụng

Nếu bạn đang sử dụng mẫu Yii2 cơ bản, thêm dòng mã sau đây thuộc thành phần trong web.php

'authManager' => [ 
       'class' => 'yii\rbac\DbManager', 
       'defaultRoles' => ['guest'], 
], 

Nếu Yii2 nâng cao mẫu, thêm các dòng mã dưới đây thuộc các thành phần trong main.php bên trong \ thư mục config \ chung

Sau khi thực hiện các bước trên cho biết,

  • Run yii di chuyển --migrationPath = @ yii/RBAC/di cư từ dòng lệnh

Đoạn mã trên sẽ tạo/tạo bốn bảng trước đó được liệt kê tự động bên trong cơ sở dữ liệu cho bạn

Để tạo Quy tắc RBAC của bạn.

Điều này yêu cầu bạn tạo quyền và vai trò.

Đối với mẫu cơ bản,

  • Tạo một tập tin và đặt tên cho nó RbacController.php bên trong lệnh thư mục

Xem http://pastebin.com/RAKpZX2J để xem làm thế nào nó trông giống như

Đối với mẫu Advanced, - Tạo cùng một tệp nhưng thay vào đó nó sẽ nằm trong console \ controllers \ RbacController.php

Sau khi thực hiện tất cả các,

  • Run yii RBAC/init // Đây willl chạy actionInit() bên trong tập tin RbacController

nếu bạn thành công tạo ra tất cả đã nói ở trên, các bạn có thể làm một cái gì đó như thế này để biết nếu người dùng có quyền

if(Yii::$app->user->can('createUser')){ 

} 

tôi hy vọng điều này sẽ giúp ..

+3

Cảm ơn nhưng làm thế nào về các quy tắc? đó là để tạo vai trò và quyền, tôi đã có điều đó. Vấn đề của tôi là làm thế nào để thực hiện các quy tắc trong bộ điều khiển ??? –

+0

@C. Norris, bạn đã sử dụng các quy tắc, nếu vậy, bạn có thể gửi một ví dụ xin vui lòng? – Ludo

0

Nếu bạn yêu cầu kiểm tra vai trò đơn giản, bạn có thể mở rộng lớp AccessRule để phù hợp với vai trò mới mà không cần đào sâu vào Kiểm soát quyền truy cập dựa trên vai trò đầy đủ. Kiểm tra hướng dẫn này để biết chi tiết đầy đủ: Simpler Role Based Authorization in Yii 2.0

Đây là cách dễ nhất mà tôi đã phát hiện để hiểu, thực hiện và duy trì vai trò, tuy nhiên bạn sẽ cân bằng tính linh hoạt mở rộng được cung cấp bởi RBAC đầy đủ để đơn giản.

Tiết lộ đầy đủ: Tôi là tác giả của bài đăng trên blog.

1

Tôi đang gặp khó khăn với điều này. Tất cả tôi có thể tìm ra cho đến bây giờ, rằng $params['post'] là hoàn toàn không làm việc cho tôi. Tôi không có đầu mối ở đâu-những gì tôi nên xác định để làm cho nó hoạt động. Nhưng những gì tôi có thể tìm ra based on the post of Joel Small, rằng nếu tôi đang làm đơn giản như vậy (tôi muốn đơn giản từ chối truy cập vào biểu mẫu cập nhật trong trường hợp một số trường hợp liên quan đến trạng thái của mô hình):

app \ rbac \ ZnwRule.php :

namespace app\rbac; 

use yii\rbac\Rule; 
use app\models\Znw; 

class ZnwRule extends Rule { 

    public function execute($user, $item, $params) { 
     $znw = Znw::findOne(\Yii::$app->request->get('id')); 
     return $znw->created_by || $znw->zwz_id == 0 || !$znw->created_at ? false : true; 
    } 
} 

và sau đó trong ZnwController:

public function actionUpdatezd($id) { 
    if (\Yii::$app->user->can('updatezd')) { 
    ... 
    } else { 
     throw new \yii\web\ForbiddenHttpException('Sorry, you are not allowed to do that.'); 
    } 

tôi đã xác định trong yii2-admin mà tôi có một quy tắc :

tên: ZnwRule

lớp: Ứng dụng \ RBAC \ ZnwRule

và tôi đã tạo ra một phép gọi updatezd:

tên: updatezd

quy tắc: ZnwRule

Tôi đã khởi động ứng dụng của mình bằng Bộ điều khiển chính nơi tôi đang kiểm tra xem tuyến đường có được phép trong yii2-admin hay không cho một vai trò nhất định và tất cả các bộ điều khiển khác mở rộng ứng dụng này. Bây giờ tôi phải xử lý các điều khoản quyền, tôi cũng phải thêm tuyến đường đó vào quyền. Tôi chắc chắn rằng nó có thể được thực hiện dễ dàng hơn, nhưng ít nhất nó có vẻ là làm việc cho đến nay. Nó không nhiều, nhưng tôi hy vọng nó sẽ giúp một số phần mở rộng.

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