Как добавить функцию "Отключить пользователя" в приложение Java EE?

У меня есть приложение Java EE, которое использует JDBCReal как JAAS Context для аутентификации на GlassFish 3.1. И ниже приведен код аутентификации в управляемом бине JSF2.0 -

FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
try {
    if (request.getUserPrincipal() != null) {
        request.logout();
    }
    if (request.getUserPrincipal() == null) {
        request.login(this.username, this.password);
    }

Я пытаюсь добавить некоторые функции администратора (например, создать / удалить / обновить / отключить пользователя). Я почти закончил со всеми из них, кроме "отключить", что сбивает меня с толку о том, как действовать.

Единственный способ, о котором я могу думать прямо сейчас, - это добавить поле, что-то вроде "status", в таблицу "users", которое будет иметь значение ("enabled" или "disabled"). И проверьте этот "статус" перед выполнением аутентификации.

Это то, как я должен сделать это, учитывая, что я использую JAAS (JDBCRealm)? Или есть какой-то другой (стандартный) способ?

Я пытаюсь понять, есть ли здесь кто-то, кто имеет некоторый опыт в этой области и может указать мне правильное направление.

1 ответ

Решение

Я полагаю, вы управляете таблицей пользователей через JDBC/JPA.

В Unix/ Linux passwd -l изменить хеш на недопустимое значение. От man passwd:

 -l   This option is used to lock the specified account and it is
      available to root only. The locking is performed by rendering
      the encrypted password into an invalid string (by prefixing the
      encrypted string with an !).

На практике разблокированный аккаунт от /etc/shadow:

test:$6$c7Lz2A2l$8AoSBy8C2U7uUns4aDRP2J/QRzUOYF...o69XPR/:15259:0:99999:7:::

И тот же аккаунт после passwd -l test:

test:!$6$c7Lz2A2l$8AoSBy8C2U7uUns4aDRP2J/QRzUOYF...o69XPR/:15259:0:99999:7:::

Префиксное значение недопустимо, потому что хеш-функции всегда возвращают одинаковое количество битов. Если ваше сохраненное значение длиннее этой длины, они никогда не будут совпадать. Вы можете сделать то же самое со своими хешированными паролями - просто добавьте к паролю префикс ! (или любая другая строка) через JDBC/JPA.

Конечно, это не работает с незашифрованными паролями.

Другое решение - удаление ролей пользователя из базы данных. В этом случае пользователь может войти, но если вы настроите security-constraint хорошо в web.xml пользователь не сможет ничего сделать (кроме выхода из системы).

Другие вопросы по тегам