1) отдельная табличка попыток сдачи, вы ведь всеравно должны куда-то результат сохранять.
2) при открытии страницы просто делать выборку из этой таблички, и проверять, можно ли пользователю заполнять тест
Отдельное хранение лимитов где-то в бд не оправдано.
Это по логике, по инструментам и способу реализации советую почитать про ACL и RBAC, это две популярные схемы управления доступом. В рамках этой маленькой задачи их использование нецелесообразно, но в следующий раз, когда возникнет вопрос про доступы уже будет на что опираться.