Фон
В нашем проекте мы используем собственную реализацию LoginModule
для интеграции JAAS для веб-приложения с PAM сервера Linux. Я знаю, что есть проекты, реализующие PAM для JAAS, но дело не в этом, особенно в том, что они не решают мою проблему.
Теперь появилось требование правильно обрабатывать старение пароля и теневой статус.
Таким образом, пользователь, который пытается войти (используя веб-форму) с паролем, который:
- expired следует запретить доступ и получить сообщение с просьбой связаться с администратором для продления учетной записи,
- inactive следует запретить доступ и получить сообщение с просьбой сменить пароль с помощью SSH,
- в период предупреждения следует предоставить доступ, но получить сообщение о том, сколько дней осталось до смены пароля.
Это нормальное поведение для PAM, которое проявляется, например, при использовании SSH. (Обратите внимание, однако, что это зависит от конфигурации PAM и настроек учетной записи.)
Проблема
Я могу легко получить необходимую информацию в нашем пользовательском файле LoginModule
. Таким образом, я буду знать статус (истек срок действия, неактивен, предупреждение, ...) и количество оставшихся дней (если применимо).
Но как его распространять дальше?
Отличие просроченного/неактивного можно сделать, тщательно выбрав исключение, созданное из реализации LoginModule
. Это не идеально, поскольку, если какой-то средний уровень использует исключения, чтобы повторно создать что-то еще, у меня снова будут проблемы. Но я думаю, это выполнимо.
А как же период предупреждения? Исключение не существует, так как это успешный вход в систему. Но мне все еще нужно предоставить дополнительную информацию о том, что этот пароль находится в периоде предупреждения и сколько дней осталось.
Единственное средство связи из LoginModule
, которое я вижу, это добавить что-то к Subject
. Но то, что я должен добавить, не похоже ни на Principal
, ни на удостоверение.
Конечно, я мог бы просто отправить свой пользовательский объект в качестве учетных данных или пользовательской реализации Principal
. Но это не кажется «естественным». Больше похоже на нарушение конструкции. Я даже не нашел ни одного примера, чтобы кто-то делал что-то подобное.
Так как же мне это сделать? Каковы средства передачи LoginModule
дополнительной информации об учетной записи?
Временное решение
На данный момент я придумал обходной путь. Я мог бы выполнять необходимые запросы в PAM/NSS, чтобы определить статус пароля и оставшиеся дни (если применимо) либо в фильтре сервлета, либо в контроллере. Это даже не сложнее — те же вызовы приходится делать в конце.
Но это не кажется правильным способом решения, потому что это смешивает обязанности.
Так что еще я мог сделать?