У меня запущено приложение на основе Java EE 7 (JSF, JPA) и CDI, использующее Shiro как для аутентификации, так и для авторизации.
У меня есть требование, чтобы пользователи должны были изменить свой пароль через определенное время (настраиваемое администратором приложения, т.е. 30 дней). В нашей таблице пользователей мы храним информацию о том, когда пароль был установлен в последний раз, и, таким образом, можем вычислить время входа в систему, если пришло время это сделать.
План состоит в том, чтобы повторно отобразить страницу входа и представить другую форму (сменить пароль вместо входа в систему). Все идет нормально. Однако: как я могу принудительно изменить пароль и не позволить пользователю перейти на другую страницу?
Есть ли рекомендуемое (или даже встроенное) решение?
Моя идея состояла бы в том, чтобы реализовать фильтр, который проверяет объект входа в сеанс на предмет того, нужно ли сбрасывать PW или нет. Можно было бы надеяться, что это так же просто, как создать новый фильтр, внедрить туда логин и проверить состояние флага - и перенаправить пользователя на страницу входа, пока флаг истинен / он не обновляет свой pw.
(У нас уже есть пользовательский EnvironmentLoaderListener с поддержкой cdi для поддержки нашей области JPA.)
Новый фильтр будет идти за последней строкой?
[urls]
/javax.faces.resource/** = anon
/layout.xhtml = anon
/css/** = anon
/login.xhtml = user
/logout.xhtml = logout
/** = user
Итак, у нас есть:
/** = user,pwresetfilter
Предложения по деталям, а также по общему решению приветствуются.