Skip to content

auth:部分数据库下user表中出现重复的管理员账号 #365

@DGCK81LNN

Description

@DGCK81LNN

预期行为

打开 auth 插件的“启用管理员账号”,user 表中始终只会有一条管理员用户的数据,管理员只有一个用户ID。

实际行为

使用MySQL时,每次启用 auth 插件都会在 user 表创建一条管理员用户的记录。

临时解决方案

只在“启用管理员账号”开启的情况下启用一次 auth 插件,随后关闭“启用管理员账号”,auth插件就不会再创建重复的记录。

代码分析

async start() {
const { enabled, username, password } = this.config.admin
if (!enabled) return
this.ctx.logger.info('creating admin account')
await this.ctx.database.upsert('user', [{
id: 0,
name: username,
authority: 5,
password: toHash(password),
createdAt: new Date(),
}])
}

实测有些数据库会直接忽略这个 id=0,直接分配一个新的 id:

select @@version;
@@⁠version
11.4.7-MariaDB
create table lnntest251223 (
  id int primary key auto_increment,
  name varchar(255),
  password varchar(255)
);

insert into lnntest251223 ( id, name, password )
values ( 0, '114514', '1919810' )
on duplicate key update
    name = values(name),
    password = values(password);

select * from lnntest251223;
id name password
1 114514 1919810
insert into lnntest251223 ( id, name, password )
values ( 0, '114514', '1919810' )
on duplicate key update
    name = values(name),
    password = values(password);

select * from lnntest251223;
id name password
1 114514 1919810
2 114514 1919810

使用正整数id则没有问题。

insert into lnntest251223 ( id, name, password )
values ( 114, '114514', '1919810' )
on duplicate key update
    name = values(name),
    password = values(password);

select * from lnntest251223;
id name password
1 114514 1919810
2 114514 1919810
114 114514 1919810

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions