预期行为
打开 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:
| @@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 |
预期行为
打开 auth 插件的“启用管理员账号”,user 表中始终只会有一条管理员用户的数据,管理员只有一个用户ID。
实际行为
使用MySQL时,每次启用 auth 插件都会在 user 表创建一条管理员用户的记录。
临时解决方案
只在“启用管理员账号”开启的情况下启用一次 auth 插件,随后关闭“启用管理员账号”,auth插件就不会再创建重复的记录。
代码分析
webui/plugins/auth/src/index.ts
Lines 122 to 133 in 896882b
实测有些数据库会直接忽略这个 id=0,直接分配一个新的 id:
使用正整数id则没有问题。