powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хранение истории нескольких последних паролей пользователя
19 сообщений из 19, страница 1 из 1
Хранение истории нескольких последних паролей пользователя
    #40001515
MarinaVinograd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемы форумчане. Прошу помощи со следующей проблемой:
Необходимо добавить возможность проверки на совпадение пароля пользователя(при изменении) с ПОСЛЕДНИМИ четырьмя ранее введёнными паролями.
В базе есть отдельная таблица USERS, в которой хранятся логин, пароль, и другие данные(отдел, фио итд). Создала табличку USERSPWDHASHHISTORY со следующими полями:
Код: sql
1.
2.
3.
4.
ID "_INTEGER" NOT NULL,
  FIO "_STRING128",
  PWDHASH "_INTEGER",
  ATTIME  "_DATETIME"



В табличке планирую хранить как раз четыре последних значения хэша паролей для каждого пользователя(благо их немного).
Необходимо написать хранимую процедуру(вернее дописать существующую, которая для изменения пользователя) которая бы добавляла в табличку USERSPWDHASHHISTORY последний введённый пароль, если для одного пользователя паролей меньше чем 4, и удаляет самый старый хеш из таблицы, если количество хешей пароля РАВНО четырём. Проблема в том, что Firebird не знает что такое последний и самый старый, и запрос придумать у меня не получается...
Версия сервера кстати 3.0
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001517
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarinaVinograd,

Ну если ты знаешь что такое последний и самый старый пароль, то остается только объяснить это FB.

Насколько я понял, то достаточно для таблицы USERS написать триггера
- перед вставкой (запись в USERSPWDHASHHISTORY)
- перед удалением (удаление из USERSPWDHASHHISTORY)
- перед обновлением (проверка старого и нового значения паролей, и если не совпадают, то удаление из USERSPWDHASHHISTORY самого старого и запись нового)
Ну а самый старый, наверное можно определить по ATTIME или ID (но я так-же как и FB не знаю что такое последний и самый старый поэтому воздержусь от конкретный советов)
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001522
MarinaVinograd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7m,

С триггерами хорошая идея, не думала об этом. Вся проблема в проверке старого и нового значения, как проверить на совпадения с четырьмя записями из другой таблицы??? А перед этим нужно посчитать количество значений.
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001536
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarinaVinograd,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WITH T AS (
SELECT
   ID,
   FIO,
   PWDHASH,
   ATTIME,
   ROW_NUMBER() OVER(ORDER BY ATTIME DESC) AS RN
FROM USERSPWDHASHHISTORY
WHERE FIO = :FIO)
SELECT
   ID, 
   FIO,
   PWDHASH,
   ATTIME
FROM T
WHERE RN > 3



вот тебе запрос который выведет значения которые старше последних тёх. Собственно всё что он выводит можно удалять, например вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
MERGE INTO USERSPWDHASHHISTORY
USING (
SELECT
   ID,
   FIO,
   PWDHASH,
   ATTIME,
   ROW_NUMBER() OVER(ORDER BY ATTIME DESC) AS RN
FROM USERSPWDHASHHISTORY
WHERE FIO = :FIO)
SELECT
   ID, 
   FIO,
   PWDHASH,
   ATTIME
FROM T
WHERE RN > 3
) S
ON USERSPWDHASHHISTORY.ID = S.ID
WHEN MATHED THEN DELETE



а после этого вставлять новый хеш пароля
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001542
MarinaVinograd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

а что такое :FIO? в запросе она как переменная, но нигде не объявлена. И может быть лучше выбирать по ID?
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001544
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarinaVinograd,

я понятия не имею как вы пользователя отбираете. Предположил, что по ФИО, ибо ID это ключ самой USERSPWDHASHHISTORY, а не идентификатор пользователя. Вам лучше знать вашу систему. Набросок запроса для отбора старейших я написал, а дальше корректируйте его под себя
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001621
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarinaVinogradкак проверить на совпадения с четырьмя записями из другой таблицы???

Откройте для себя Руководство Языка Firebird, раздел "Ограничения", подраздел "Ограничения
уникальности".

MarinaVinogradА перед этим нужно посчитать количество значений.

Там же, "Агрегатные функции", "COUNT".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001629
MarinaVinograd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Спасибо за отличный совет, а особенно за ссылки на руководство и пункты!
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001630
MarinaVinograd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
MarinaVinograd,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WITH T AS (
SELECT
   ID,
   FIO,
   PWDHASH,
   ATTIME,
   ROW_NUMBER() OVER(ORDER BY ATTIME DESC) AS RN
FROM USERSPWDHASHHISTORY
WHERE FIO = :FIO)
SELECT
   ID, 
   FIO,
   PWDHASH,
   ATTIME
FROM T
WHERE RN > 3



вот тебе запрос который выведет значения которые старше последних тёх. Собственно всё что он выводит можно удалять, например вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
MERGE INTO USERSPWDHASHHISTORY
USING (
SELECT
   ID,
   FIO,
   PWDHASH,
   ATTIME,
   ROW_NUMBER() OVER(ORDER BY ATTIME DESC) AS RN
FROM USERSPWDHASHHISTORY
WHERE FIO = :FIO)
SELECT
   ID, 
   FIO,
   PWDHASH,
   ATTIME
FROM T
WHERE RN > 3
) S
ON USERSPWDHASHHISTORY.ID = S.ID
WHEN MATHED THEN DELETE



а после этого вставлять новый хеш пароля


не совсем понятно как использовать таблицу Т вместе с
Код: sql
1.
MERGE INTO

и MATCHED
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001633
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarinaVinograd,

запрос же от руки писался без проверки. Забыл WITH T AS ( скопировать


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
MERGE INTO USERSPWDHASHHISTORY
USING (
  WITH T AS ( 
  SELECT
    ID,
    FIO,
    PWDHASH,
    ATTIME,
    ROW_NUMBER() OVER(ORDER BY ATTIME DESC) AS RN
  FROM USERSPWDHASHHISTORY
  WHERE FIO = :FIO)
  SELECT
    ID, 
    FIO,
    PWDHASH,
    ATTIME
  FROM T
  WHERE RN > 3
) S
ON USERSPWDHASHHISTORY.ID = S.ID
WHEN MATHED THEN DELETE
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001639
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениснапример вот так

Не учи блондинку плохому. В её случае достаточно "delete ... rows 5 to 100500".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001647
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ИХМО я бы вообще забил на удаления, ибо как раз оно зло в данном случае.
Достаточно проверить в истории, что такой пароль присутствует среди последних 4-х, и если да бросать исключение


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT COUNT(*) AS CNT
FROM (
    SELECT FIO, PWDHASH 
    FROM USERSPWDHASHHISTORY
    WHERE FIO = :FIO
    ORDER BY ATTIME DESC
    FETCH FIRST 4 ROWS ONLY 
)
WHERE PWDHASH = :PWDHASH
INTO :CNT;

IF (CNT > 0) THEN
  EXCEPTION E_PASS_EXISTS; 

INSERT INTO USERSPWDHASHHISTORY ...
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001652
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисДостаточно проверить в истории, что такой пароль присутствует среди последних 4-х

Оно, конечно, да, но она ведь может решить, что это нормальный (то бишь универсальный и
широкоупотребительный) способ проверки ограничений...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001663
MarinaVinograd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Пока что ничего лучше для такой нетривиальной задачи никто не предложил
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001673
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarinaVinogradтакой нетривиальной задачи

Проверка уникальности значения нынче стала нетривиальной задачей?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001676
MarinaVinograd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, всё сводится не только к проверке уникальности значения
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001691
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarinaVinogradвсё сводится не только к проверке уникальности значения

А к чему ещё? Ограничению количества записей в таблице? Эта задача такая же древняя и
такая же тривиальная, как и первая. (edit: в условиях системы без конкурирующих изменений, которое в данном топике удовлетворено.)
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001697
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarinaVinograd
m7m,
Вся проблема в проверке старого и нового значения, как проверить на совпадения

EXISTS

MarinaVinograd
с четырьмя записями из другой таблицы???

Не с четырьмя а со всеми которые есть для данного пользователя ибо
MarinaVinograd
В табличке планирую хранить как раз четыре последних значения хэша паролей для каждого пользователя

MarinaVinograd
А перед этим нужно посчитать количество значений.
Не надо, delete ... order by rows .. to ... сделает все за тебя
...
Рейтинг: 0 / 0
Хранение истории нескольких последних паролей пользователя
    #40001703
MarinaVinograd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7m,
Симонов Денис, спасибо за ответы!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хранение истории нескольких последних паролей пользователя
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]