Интеграция Java JAAS с Linux PAM, включая устаревание пароля

Фон

В нашем проекте мы используем собственную реализацию LoginModule для интеграции JAAS для веб-приложения с PAM сервера Linux. Я знаю, что есть проекты, реализующие PAM для JAAS, но дело не в этом, особенно в том, что они не решают мою проблему.

Теперь появилось требование правильно обрабатывать старение пароля и теневой статус.

Таким образом, пользователь, который пытается войти (используя веб-форму) с паролем, который:

  • expired следует запретить доступ и получить сообщение с просьбой связаться с администратором для продления учетной записи,
  • inactive следует запретить доступ и получить сообщение с просьбой сменить пароль с помощью SSH,
  • в период предупреждения следует предоставить доступ, но получить сообщение о том, сколько дней осталось до смены пароля.

Это нормальное поведение для PAM, которое проявляется, например, при использовании SSH. (Обратите внимание, однако, что это зависит от конфигурации PAM и настроек учетной записи.)

Проблема

Я могу легко получить необходимую информацию в нашем пользовательском файле LoginModule. Таким образом, я буду знать статус (истек срок действия, неактивен, предупреждение, ...) и количество оставшихся дней (если применимо).

Но как его распространять дальше?

Отличие просроченного/неактивного можно сделать, тщательно выбрав исключение, созданное из реализации LoginModule. Это не идеально, поскольку, если какой-то средний уровень использует исключения, чтобы повторно создать что-то еще, у меня снова будут проблемы. Но я думаю, это выполнимо.

А как же период предупреждения? Исключение не существует, так как это успешный вход в систему. Но мне все еще нужно предоставить дополнительную информацию о том, что этот пароль находится в периоде предупреждения и сколько дней осталось.

Единственное средство связи из LoginModule, которое я вижу, это добавить что-то к Subject. Но то, что я должен добавить, не похоже ни на Principal, ни на удостоверение.

Конечно, я мог бы просто отправить свой пользовательский объект в качестве учетных данных или пользовательской реализации Principal. Но это не кажется «естественным». Больше похоже на нарушение конструкции. Я даже не нашел ни одного примера, чтобы кто-то делал что-то подобное.

Так как же мне это сделать? Каковы средства передачи LoginModule дополнительной информации об учетной записи?

Временное решение

На данный момент я придумал обходной путь. Я мог бы выполнять необходимые запросы в PAM/NSS, чтобы определить статус пароля и оставшиеся дни (если применимо) либо в фильтре сервлета, либо в контроллере. Это даже не сложнее — те же вызовы приходится делать в конце.

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

Так что еще я мог сделать?


person Adam Badura    schedule 10.12.2015    source источник


Ответы (1)


Я думаю, что понимаю, чего вы пытаетесь достичь, но LoginModule не несет ответственности за состояние пароля, и это не то, для чего был разработан JAAS.

Из-за этого я думаю, что ваш обходной путь - это путь. Если вам легко получить дополнительную информацию в LoginModule, создайте там поле или передайте объект, в котором вы будете хранить эти данные и получать к ним доступ всякий раз, когда они должны быть представлены пользователю. - ПОЦЕЛУЙ

person FazoM    schedule 10.12.2015