yiisoft / yii2

Yii 2: The Fast, Secure and Professional PHP Framework
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
14.24k stars 6.91k forks source link

Error ? rbac, varchar(64) != int(11) #16596

Closed travacry closed 6 years ago

travacry commented 6 years ago

Error ?, rbac, can't create fk -> auth_assignment.user_id -> varchar(64) -> user.id -> int(11) => varchar(64) != int(11)

yiisoft/yii2-app-advanced yiisoft/yii2": "~2.0.6

Вообщем странно, посмотрите, может стоит добавить миграцию :

$this->alterColumn('auth_assignment', 'user_id', 'int(11)'); $this->addForeignKey( 'fk-auth_assignment-user', 'auth_assignment', 'user_id', 'user', 'id' );

mgrechanik commented 6 years ago

You are supposed to make this decision by yourself if needed See: https://www.yiiframework.ru/forum/viewtopic.php?t=30805 https://github.com/yiisoft/yii2/issues/5435

And don't forget that assignments are cached during page run and expected to be revoked by $auth->revoke...

travacry commented 6 years ago

user_id maybe email, ok.

ru : Согласен, что является id в user должен решать сам разработчик, но если есть указание на id, а user_id подразумевает это (1.таблица = user, 2.id), связь должна идти на id, а условие связи - идентичные типы пока никто не отменял.

Да и так по факту есть (связь по умолчанию на user (id)), непонятно только почему varchar(64), а не int(11). Почему используется это механизм : $this->createTable($authManager->assignmentTable, [ 'item_name' => Schema::TYPE_STRING . '(64) NOT NULL', 'user_id' => Schema::TYPE_STRING . '(64) NOT NULL', 'created_at' => Schema::TYPE_INTEGER, 'PRIMARY KEY (item_name, user_id)', 'FOREIGN KEY (item_name) REFERENCES ' . $authManager->itemTable . ' (name) ON DELETE CASCADE ON UPDATE CASCADE', ], $tableOptions); а не выборка типа через схему реального типа.

samdark commented 6 years ago

Потому что id в RBAC !== ID из user. Это может быть что угодно, в том числе и строка.