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

#java #authentication #jakarta-ee #jaas #jdbcrealm

#java #аутентификация #джакарта-ee #jaas #jdbcrealm

Вопрос:

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

 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);
    }
  

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

Единственный способ, который я могу придумать прямо сейчас, — это добавить в таблицу «пользователи» поле, что-то вроде «статус», которое будет иметь значение («включено» или «отключено»). И проверьте этот «статус» перед выполнением аутентификации.

Так ли я должен это делать, учитывая, что я использую 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:::
  

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

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

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

Комментарии:

1. Большое спасибо за ваш вклад. 1 за то, что по вашей идее мне не нужно добавлять еще один столбец «статус» в таблицу пользователей. Но в основном я пытаюсь понять, нужно ли вручную проверять, существует ли пользователь, и если да, то отключен ли он или включен, а затем выполнять вход в систему только в том случае, если пользователь существует и включен.

2. Нет необходимости проверять это вручную, login() метод / JDBCRealm сделает это за вас. Но если вы хотите напечатать более подробное сообщение об ошибке («ошибка входа в систему, отключенный пользователь», а не просто «ошибка входа в систему»), вы должны проверить его вручную с помощью JDBC / JPA. (Также проверьте обновление ответа.)

3. Просто нужно, чтобы кто-нибудь подтвердил это. Спасибо. Я приму ваш ответ.