Если вы намерены запретить совместное использование одного имени пользователя на разных компьютерах, после входа в систему с действительным паролем зарегистрируйте уникальный токен на этом компьютере в staff.last_logged_at = @ unique_token . Выйдя из системы, установите staff.last_logged_at = ''. Таким образом, даже если компьютер был прерван (сбой программы из-за вируса, или случайно нажал кнопку сброса компьютера и т. Д., Следовательно, last_logged_at не был сброшен в ''), пользователь все еще может войти в систему, просто проверьте, есть ли токен компьютер, на котором в данный момент находится пользователь, совпадает с last_logged_at. Если это то же самое, он / она может войти в систему.
Если какой-либо пользователь попытался войти, используя имя другого пользователя, просто проверьте, совпадает ли машинный токен компьютера другого пользователя с last_logged_at другого пользователя, если он не равен, запретите вход в систему, это означает, что два пользователя используют один и тот же пароль .
Теперь сценарий, если компьютер зависает очень тяжело (процессор тает, сбой жесткого диска, требуется переустановка ОС и т. Д.). Пользователь должен иметь возможность использовать другие компьютеры. Сделайте административный модуль , который может сбросить last_logged_at пользователя.
Для @unique_token просто используйте на компьютере все, что является уникальным и постоянным , скажем, MAC-адрес, или хэшируйте что-нибудь в настройках ОС.
псевдокод:
Logging In:
if (select count(*) from staff where staff_name = @staff_name and password = 'correct' and (last_logged_at = '' or last_logged_at = @unique_token) ) <> 0 then then
-- allow login
update staff set last_logged_at = @unique_token where staff_name = @staff_name
else if (select count(*) from staff where staff_name = @staff_name and password = 'correct' and last_logged_at <> @unique_token) <> 0 then then
-- disallow login
throw exception "You cannot use the same user name on two or more computers. Contact the administrator if you have any concerns"
else
-- disallow login
throw exception "Wrong password"
end if
Logging Out:
update staff set last_logged_at = '' where staff_name = @staff_name