feat(permissions): A4 — убрать role-level token_version bump (нет массового разлогина)

requirePermission читает права из БД на каждый запрос → серверное применение
живое. Прежний bump token_version при role-level изменении разлогинивал ВСЕХ
пользователей роли из-за одного тумблера. Убрали его: изменение применяется
сразу на сервере, клиент подхватит при следующем /permissions/me. User-level
bump оставлен (точечно одному пользователю — целевое обновление, не массовое).
Тест 3 обновлён: role-level НЕ бампает token_version + значение сохраняется.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-03 14:17:32 +03:00
parent 7d474b40c0
commit 6bd1532735
2 changed files with 15 additions and 12 deletions
+8 -3
View File
@@ -41,8 +41,8 @@ describe('Permissions', () => {
assert.equal(res.status, 401, `expected 401, got ${res.status}`);
});
// ── 3. Admin can toggle role-level permission + token_version bumped ──────
it('admin toggles role permission and student token_version is bumped', async () => {
// ── 3. Role-level toggle сохраняется и НЕ инвалидирует сессии (live enforcement)
it('admin toggles role permission; token_version НЕ бампается (нет массового разлогина)', async () => {
const tvBefore = db.prepare('SELECT token_version FROM users WHERE id = ?')
.get(studentUser.userId).token_version;
@@ -52,9 +52,14 @@ describe('Permissions', () => {
assert.equal(res.status, 200, `expected 200, got ${res.status}: ${JSON.stringify(res.body)}`);
assert.equal(res.body.ok, true);
// Значение сохранено в role_permissions — сервер применяет его живо (requirePermission читает БД).
const row = db.prepare('SELECT enabled FROM role_permissions WHERE role = ? AND permission = ?')
.get('student', 'tests.free');
assert.equal(row.enabled, 0, 'role-level значение сохранено');
const tvAfter = db.prepare('SELECT token_version FROM users WHERE id = ?')
.get(studentUser.userId).token_version;
assert.ok(tvAfter > tvBefore, `token_version should increase (was ${tvBefore}, got ${tvAfter})`);
assert.equal(tvAfter, tvBefore, 'role-level изменение НЕ должно разлогинивать пользователей роли');
// Restore
await inject('POST', '/api/permissions', {