2016-01-22 68 views
1

http://www.yiiframework.com/doc-2.0/guide-security-authorization.html#role-based-access-control-rbac如何爲Yii2中的基本模板用戶分配角色?

在本文檔中,它說,你可以使用此代碼分配角色在高級模板的用戶:

public function signup() 
{ 
    if ($this->validate()) { 
     $user = new User(); 
     $user->username = $this->username; 
     $user->email = $this->email; 
     $user->setPassword($this->password); 
     $user->generateAuthKey(); 
     $user->save(false); 

     // the following three lines were added: 
     $auth = Yii::$app->authManager; 
     $authorRole = $auth->getRole('author'); 
     $auth->assign($authorRole, $user->getId()); 

     return $user; 
    } 

    return null; 
} 

的問題是,我使用的基本模板。在基本模板中有沒有這樣做的方法?

我想過使用afterSave方法;但是,我不知道如何做到這一點。

public function afterSave($insert) 
{ 

} 

關於如何完成任何想法?

public function afterSave($insert) 
{ 
    $auth = Yii::$app->authManager; 
    $authorRole = $auth->getRole('author'); 
    $auth->assign($authorRole, $this->Id()); 
} 

我在想這可行,但我不完全確定。

回答

3

它不依賴於使用的模板。

你的例子是正確的,除了幾件事情。

$this->Id()應替換爲$this->id(假設用戶表的主鍵名爲id)。

請注意,您也需要調用afterSave()方法的父類的實現和你錯過$changedAttributes參數:

/** 
* @inheritdoc 
*/ 
public function afterSave($insert, $changedAttributes) 
{ 
    $auth = Yii::$app->authManager; 
    $authorRole = $auth->getRole('author'); 
    $auth->assign($authorRole, $this->id); 

    parent::afterSave($insert, $changedAttributes); 
} 

進一步改進,你可以在交易包裹保存,所以如果事情失敗在afterSave(),模式不保存(afterSave()將模型保存到數據庫後執行事件處理程序)。

您也可以將角色邏輯分配給單獨的方法。

請注意,有了這個邏輯,每個註冊用戶都將擁有該角色。你可以用一些條件包裝它,但最好通過管理界面分配角色。

你可以看到它是如何實現的,例如在this extension。例如,您可以創建單獨的表單,操作並使用附加圖標來擴展GridViewActionColumn以分配角色。

相關問題