Admin: password confirmation field + validation
- Added password_confirm field in user edit/new forms - Validation: passwords must match, min 6 chars - New user: password required - Edit user: password optional (leave empty to keep)
This commit is contained in:
parent
cb412f5b1d
commit
4008155abd
26
lib/admin.js
26
lib/admin.js
@ -101,7 +101,7 @@ async function setupAdmin(app) {
|
|||||||
options: {
|
options: {
|
||||||
navigation: { name: 'Пользователи', icon: 'User' },
|
navigation: { name: 'Пользователи', icon: 'User' },
|
||||||
listProperties: ['id', 'email', 'display_name', 'role', 'is_blocked', 'last_login'],
|
listProperties: ['id', 'email', 'display_name', 'role', 'is_blocked', 'last_login'],
|
||||||
editProperties: ['email', 'display_name', 'role', 'is_blocked', 'password'],
|
editProperties: ['email', 'display_name', 'role', 'is_blocked', 'password', 'password_confirm'],
|
||||||
showProperties: ['id', 'email', 'display_name', 'role', 'is_blocked', 'created_at', 'last_login'],
|
showProperties: ['id', 'email', 'display_name', 'role', 'is_blocked', 'created_at', 'last_login'],
|
||||||
properties: {
|
properties: {
|
||||||
password_hash: { isVisible: false },
|
password_hash: { isVisible: false },
|
||||||
@ -110,26 +110,40 @@ async function setupAdmin(app) {
|
|||||||
isVisible: { list: false, show: false, edit: true, filter: false },
|
isVisible: { list: false, show: false, edit: true, filter: false },
|
||||||
description: 'Оставьте пустым чтобы не менять',
|
description: 'Оставьте пустым чтобы не менять',
|
||||||
},
|
},
|
||||||
|
password_confirm: {
|
||||||
|
type: 'password',
|
||||||
|
isVisible: { list: false, show: false, edit: true, filter: false },
|
||||||
|
description: 'Повторите пароль',
|
||||||
|
},
|
||||||
role: { availableValues: [{ value: 'user', label: 'User' }, { value: 'admin', label: 'Admin' }] },
|
role: { availableValues: [{ value: 'user', label: 'User' }, { value: 'admin', label: 'Admin' }] },
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
edit: {
|
edit: {
|
||||||
before: async (request) => {
|
before: async (request) => {
|
||||||
if (request.payload && request.payload.password && request.payload.password.trim()) {
|
const pw = request.payload?.password?.trim();
|
||||||
|
const pw2 = request.payload?.password_confirm?.trim();
|
||||||
|
if (pw) {
|
||||||
|
if (pw !== pw2) throw new Error('Пароли не совпадают');
|
||||||
|
if (pw.length < 6) throw new Error('Пароль минимум 6 символов');
|
||||||
const bcrypt = require('bcrypt');
|
const bcrypt = require('bcrypt');
|
||||||
request.payload.password_hash = await bcrypt.hash(request.payload.password, 10);
|
request.payload.password_hash = await bcrypt.hash(pw, 10);
|
||||||
}
|
}
|
||||||
delete request.payload.password;
|
delete request.payload.password;
|
||||||
|
delete request.payload.password_confirm;
|
||||||
return request;
|
return request;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
new: {
|
new: {
|
||||||
before: async (request) => {
|
before: async (request) => {
|
||||||
if (request.payload && request.payload.password && request.payload.password.trim()) {
|
const pw = request.payload?.password?.trim();
|
||||||
|
const pw2 = request.payload?.password_confirm?.trim();
|
||||||
|
if (!pw) throw new Error('Пароль обязателен');
|
||||||
|
if (pw !== pw2) throw new Error('Пароли не совпадают');
|
||||||
|
if (pw.length < 6) throw new Error('Пароль минимум 6 символов');
|
||||||
const bcrypt = require('bcrypt');
|
const bcrypt = require('bcrypt');
|
||||||
request.payload.password_hash = await bcrypt.hash(request.payload.password, 10);
|
request.payload.password_hash = await bcrypt.hash(pw, 10);
|
||||||
}
|
|
||||||
delete request.payload.password;
|
delete request.payload.password;
|
||||||
|
delete request.payload.password_confirm;
|
||||||
return request;
|
return request;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user