Назначение роли при регистрации

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Назначение роли при регистрации

Сообщение svil » 2019.05.03, 19:20

Использую расширение mdmsoft-yii2-admin
Если назначать роль через это расширение в его админке RBAC -роль присваивается
Если вручную в контроллере - нет
Ошибка

Код: Выделить всё

Integrity constraint violation – yii\db\IntegrityException
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'user-3' for key 'PRIMARY'
The SQL being executed was: INSERT INTO `auth_assignment` (`user_id`, `item_name`, `created_at`) VALUES ('3', 'user', 1556900032)
Error Info: Array
(
    [0] => 23000
    [1] => 1062
    [2] => Duplicate entry 'user-3' for key 'PRIMARY'
)
↵
Caused by: PDOException
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'user-3' for key 'PRIMARY'
Но в таблице auth_assignment user это роль, она и должна повторяться.
В контроллере

Код: Выделить всё

    public function actionSignup()
    {
        $userRole = Yii::$app->authManager->getRole('user');
        $model = new Signup();
        if ($model->load(Yii::$app->getRequest()->post())) {

            Yii::$app->authManager->assign($userRole, Yii::$app->user->getId()); //здесь роль user должна записываться

            if ($user = $model->signup()) {

                return $this->goHome();
            }
        }
На 31м 41 сек видео https://www.youtube.com/watch?v=kXhzSN_InV0
при попытке за автором назначить разрешение(доступ) по коду

Код: Выделить всё

public function actionRole() {
/*
     $admin = Yii::$app->authManager->createRole('admin');
     $admin->description = 'Администратор';
     Yii::$app->authManager->add($admin);

     $user = Yii::$app->authManager->createRole('user');
     $user->description = 'Пользователь';
     Yii::$app->authManager->add($user);
*//*
     $permit = Yii::$app->authManager->createPermission('canAdmin');
     $permit->description = 'Право на вход в админку';
     Yii::$app->authManager->add($permit);
 */
     $role_a = Yii::$app->authManager->getRole('admin');
     $role_u = Yii::$app->authManager->getRole('user');
     $permit = Yii::$app->authManager->getPermission('canAdmin');
     Yii::$app->authManager->addChild($role_a, $permit);
     Yii::$app->authManager->addChild($role_u, $permit);

     return 123;
вылетает такая же ошибка SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry

Аватара пользователя
leonenco
Сообщения: 128
Зарегистрирован: 2017.01.30, 22:42

Re: Назначение роли при регистрации

Сообщение leonenco » 2019.05.04, 03:53

Вот мой Rbac controller и SignupModel все работает:

Rbac Controller

Код: Выделить всё

class RbacController extends Controller
{
	public function actionInit()
	{
		$auth = Yii::$app->authManager;
		$auth->removeAll(); //удаляем старые данные//Remove old permitions data
		
		//Создадим права для доступа к админке
                //Create permition do access Administrator manager panel
		$dashboard = $auth->createPermission('admin-dashboard');
		$dashboard->description = 'Admin manager panel';
		$auth->add($dashboard);

		//Включаем наш обработчик
		$rule = new UserRoleRule();
		$auth->add($rule);
		
		//Добавляем роли
		$user = $auth->createRole('user');
		$user->description = 'User';
		$user->ruleName = $rule->name;
		$auth->add($user);
		
		$company = $auth->createRole('company');
		$company->description = 'Company';
		$company->ruleName = $rule->name;
		$auth->add($company);
		
		$admin = $auth->createRole('admin');
		$admin->description = 'Administrator';
		$admin->ruleName = $rule->name;
		$auth->add($admin);
		
		//Добавляем правила потомкам
		/*
		//User permitions
		$auth->addChild($user, $dashboard);
		
		//Company permitions
                //Add user permition
		$auth->addChild($company, $user);
                //Add permition for company to CRUD Projects
		$auth->addChild($company, $viewProjects);
                $auth->addChild($company, $createProjects);
                $auth->addChild($company, $editProjects);
                $auth->addChild($company, $deleteProjects);
                //Add permition for company to CRUD Proposals
                $auth->addChild($company, $viewProposals);
                $auth->addChild($company, $createProposals);
                $auth->addChild($company, $editProposals);
                $auth->addChild($company, $deleteProposals);
                //Add permition for company to CRUD Company Customers
                $auth->addChild($company, $viewCustomers);
                $auth->addChild($company, $createCustomers);
                $auth->addChild($company, $editCustomers);
                $auth->addChild($company, $deleteCustomers);
		*/
		//Admin permitions
		
		$auth->addChild($admin, $dashboard);
		
		// Assign roles to users. 1 and 2 are IDs returned by IdentityInterface::getId()
		// usually implemented in your User model.
		$auth->assign($admin, 1);
	}
}
SignupModel

Код: Выделить всё

public function signup()
    {
        if (!$this->validate()) {
            return null;
        }
        
        $user = new User();
        $profile = new UserProfile();
        $user->username = $this->username;
        $user->email = $this->email;
        $user->setPassword($this->password);
        $user->generateAuthKey();
        $user->generateEmailVerificationToken();
        $user->role = $user::ROLE_USER;
        $user->status = $user::STATUS_DELETED;//Set user status deleted to verify email address
        if($user->save()){ //$user->save(false) without validation
            //Setup new user profile
            $profile->user_id = $user->getId();
            $profile->save();
//            $company = new CompanyProfile();
//            $company->user_id = $user->getId();
//            $company->save(false);
//            $subscription = new PlanSubscription();
//            $subscription->user_id = $user->getId();
//            $subscription->notes = true;
//            $subscription->save(false);
        }
        $auth = Yii::$app->authManager;
        if($auth->revokeAll($user->getId())){
            $authorRole = $auth->getRole('user');
            $auth->assign($authorRole, $user->getId());
        } else {
            $authorRole = $auth->getRole('user');
            $auth->assign($authorRole, $user->getId());
        }
        
        
        return $user && $this->sendEmail($user);

    }

Аватара пользователя
svil
Сообщения: 560
Зарегистрирован: 2018.02.12, 22:41

Re: Назначение роли при регистрации

Сообщение svil » 2019.05.04, 08:39

Спасибо, буду пробовать

Ответить