2016-02-26 36 views
8

Witajcie, widziałem wiele tutoriali Yii 2 RBAC, ale nie jestem w stanie docenić sposobu implementacji reguł. W przewodniku Yii 2 przedstawili zasady działania, ale nie w jaki sposób można je zastosować w zachowaniu kontrolera lub gdzie indziej. Naprawdę potrzebuję oświecenia w tej sprawie.Yii2 RBAC Implementacja reguły

Mam teraz system przesyłania dokumentów, w którym mam dwie role, mianowicie koder admin &. Zasadniczo rola administratora może zrobić wszystko, podczas gdy rola enkodera może tylko tworzyć, wyświetlać, aktualizować i usuwać własne. Stworzyłem już regułę o nazwie encodedBy.

To jest mój kod w moim EncoderRule

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; 
    } } 

przechowywać dane w tabeli „dokument”, gdzie mam pole o nazwie „encoded_by” Mam nadzieję, że chłopaki mogą mi pomóc w tej sprawie. Wielkie dzięki!

+0

Ten film naprawdę dobrze wyjaśnia objaśnienie RBAC dla każdego, kto nie jest pewien, jak to działa: https://www.youtube.com/watch?v = vLb8YATO-HU – TheStoryCoder

Odpowiedz

2

Jeśli dobrze Cię rozumiem, chcesz użyć reguły RBAC Yii2 do wdrożenia pewnych uprawnień dla użytkowników systemu (administratora i kodera). Cóż, jest to całkiem proste do pewnego stopnia.

Yii2 ma istniejące tabele do tego celu. Te tabele są i. auth_assignment ii. auth_item iii. auth_item_child iv. auth_rule

Pierwszą rzeczą jaką musisz zrobić, to wybrać, które authManager chcesz użyć albo PhpManager lub DBManager ale radzę użyć DBManager Wynika to z faktu, że to jest to, czego używam

Jeśli używasz szablon Yii2 Basic, należy dodać następujące linie kodu w ramach komponentów w web.php

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

Jeśli Yii2 zaawansowane szablon, dodać linie kodu poniżej pod komponentów w main.php wewnątrz \ Common \ folderze config

Uczyniwszy wspomniany powyżej krokach

  • Run Yii migrują --migrationPath = @ Yii/RBAC/migracje z linii poleceń

Powyższy kod wygeneruje/utworzyć cztery tabele był wcześniej wymieniony automatycznie w bazie danych dla ciebie

Aby utworzyć Reguły RBAC.

Wymaga to tworzenia uprawnień i ról.

Do podstawowego szablonu,

  • Tworzenie pliku i nazwać to RbacController.php wewnątrz polecenia Folder

Zobacz http://pastebin.com/RAKpZX2J zobaczyć jak to wygląda

dla zaawansowanych szablonu, - Utwórz ten sam plik, ale zamiast tego będzie wewnątrz konsoli \ controllers \ RbacController.php

Po wykonaniu tych wszystkich,

  • Run Yii RBAC/init // willl to uruchomić actionInit() w pliku RbacController

jeśli pomyślnie utworzony wszystko powiedział powyżej, ty można zrobić coś takiego wiedzieć, czy użytkownik ma uprawnienia

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

} 

mam nadzieję, że to pomaga ..

+3

Dzięki, ale co z zasadami? to do tworzenia ról i uprawnień, już to mam. Mój problem polega na tym, jak zaimplementować reguły w kontrolerze ??? –

+0

@C. Norris, czy użyłeś zasad, jeśli tak, czy możesz wysłać przykład? – Ludo

0

Jeśli potrzebujesz prostego sprawdzania ról, możesz rozszerzyć klasę AccessRule, aby uwzględnić nowe role bez zagłębiania się w pełną kontrolę dostępu opartą na rolach. Przeczytaj ten samouczek, aby uzyskać szczegółowe informacje: Simpler Role Based Authorization in Yii 2.0

Jest to najłatwiejszy sposób, w jaki odkryłem, aby zrozumieć, wdrożyć i utrzymać role, jednak w zamian za prostotę można się odnieść do szerokiej elastyczności zapewnianej przez pełny RBAC.

Pełne ujawnienie: Jestem autorem wpisu na blogu.

1

Walczę również z tym. Wszystko, co mogłem zrozumieć do tej pory, że $params['post'] absolutnie nie działa dla mnie. Nie mam pojęcia, gdzie - co powinienem zdefiniować, aby działało. Ale co mogłem dowiedzieć based on the post of Joel Small, że jeśli robię po prostu tak (chcę po prostu odmówić dostępu do formularza aktualizacji w przypadku niektórych okoliczności dotyczących stanu modelu):

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; 
    } 
} 

a następnie w 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.'); 
    } 

mam zdefiniowane w yii2-admin, że mam regułę:

nazwa: ZnwRule

klasa: app \ RBAC \ ZnwRule

i ja stworzyliśmy pozwolenie nazwie updatezd:

nazwie: updatezd

regułę: ZnwRule

Uruchomiłem swoją aplikację z głównym kontrolerem, gdzie sprawdzam, czy trasa jest dozwolona w yii2-admin, czy nie dla określonej roli, a wszyscy inni kontrolerowie ją rozszerzają. Teraz, gdy miałem do czynienia z uprawnieniami i regułami, musiałem dodać trasę również do pozwolenia. Jestem pewien, że może to być łatwiejsze do zrealizowania, ale przynajmniej wydaje się działać do tej pory. To niewiele, ale mam nadzieję, że pomoże to w pewnym zakresie.