2017-02-17 3 views
0

Я пытаюсь добавить запомнить функциональность моего приложения, но по какой-то причине HttpServletRequest.login() бросает ServletException:Запомнить меня авто вход с JSF + JAAS

javax.servlet.ServletException: Login failed 
at com.cleanup.filter.AutoLoginFilter.doFilter(AutoLoginFilter.java:71) 

Линия 71:

req.login(adminUser.getEmail(), adminUser.getPwd()); 

Я знаю, что согласно документации:

Throws: ServletException - если настроенный механизм входа не поддерживает аутентификацию имени пользователя или если недействительный идентификатор вызывающего абонента уже установлен (до вызова для входа в систему) или , если проверка предоставленного имени пользователя и сбой пароля.

Что в свою очередь означает, что учетные данные «недействителен», который не верно, так как бревно в механизм работает нормально.

Но почему это должно было исключить это исключение?

Моя теория заключается в том, что она связана с тем, что password зашифрован, но если это так, не должно request.login(..,..) также работать с уже хэшированным паролем?

Вот мой фильтр:

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) 
     throws IOException, ServletException { 


    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse resp = (HttpServletResponse) response; 

    String remoteUser = (String) req.getRemoteUser(); 

    if (remoteUser == null) { 

     String uuid = CookieRememberUtil.getCookieValue(req); 

     System.out.println("Found cookie" + uuid); 

     if (uuid != null) { 
      AdminUsers adminUser = cookiesFacade.getAdminUserFromUUID(uuid); 

      if (adminUser != null) { 

       req.login(adminUser.getEmail(), adminUser.getPwd()); 
       CookieRememberUtil.addCookie(resp, uuid); 
      } else { 
       CookieRememberUtil.removeCookie(resp); 
      } 
     } 

    } 
    chain.doFilter(request, response); 

} 

ответ

0

Проблема лежит в основе реализации царством, что поддерживает ваш процесс входа в систему.

Метод входа в систему неизбежно переходит в сконфигурированное Realm для выполнения этой фактической аутентификации. Например, если вы используете БД Realm, Realm будет искать пользователя в БД, сравнивать пароли, а затем извлекать информацию о роли.

Итак, что вам нужно сделать, это сделать ваше царство «cookie know».

То есть, когда вы нажимаете на свой фильтр, вы можете проверить свой cookie «помните меня» и в основном передать эту информацию в метод входа в систему, чтобы он в конечном итоге прибыл в ваш пользовательский Realm, который затем делает правильный вещь.

String uuid = CookieRememberUtil.getCookieValue(req); 
if (uuid != null) { 
    req.login("***REMEMBER_ME***", uuid); 
} else { 
    ... run your normal login logic 
} 

Царство затем ищет волшебный пользователь, чье имя является «Remember_Me», и использует UUID извлечь учетные данные и создать принципала.

Затем, как правило, вы запрещаете такие вещи, как «*» от имени пользователя, таким образом, для кого-то сложнее войти в систему и спамить вас с помощью UUID, чтобы попытаться получить доступ. Вы проверяете это во время входа в систему и просто прерываете с недопустимым именем пользователя, пользователь не найден и т. Д.

Итак, TLDR, вам нужен пользовательский мир для вашего контейнера.

Edit:

Для того, чтобы контейнер для выполнения авторизации, он использует понятие называется Realm.Царство - это часть кода, которая проверяет пользователя, проверяет их пароль и загружает их роли, создавая Принципала. Все контейнеры поставляются со встроенными Realms, которые выполняют основные функции: работа с плоским файлом, работа с базой данных, возможно, работа с сервером LDAP.

Вы можете написать пользовательскую реализацию Realm и установить ее в свой контейнер, это, как правило, довольно простой интерфейс, который вы реализуете.

ПОЛНАЯ ЦЕЛЬ Королевства - это принять верительные грамоты и вернуть Принципала. Используя программный модуль входа в систему Servlet 3.x, вы можете выбрать не только, когда нужно сделать логин, но и какие учетные данные перейдите в Царство.

Обычно вы передаете имя пользователя и пароль. Realm ищет имя пользователя, хеширует пароль, сравнивает его с тем, что хранит, и вуаля, создает простого принципала и возвращает его.

В вашем случае, если у вас есть набор cookie REMEMBER_ME, вместо того, чтобы возвращать имя пользователя и пароль (которых у вас нет, поскольку вы не запрашиваете его), вы возвращаете cookie или данные, которые вы может извлечь из cookie. Но ваш единственный интерфейс к царству, через метод входа, принимает имя пользователя и пароль. По правде говоря, он принимает две строки, которые могут HAPPEN быть именем пользователя и паролем. По правде говоря, они могут быть любыми - например, флаг сообщает Realm о регистрации через значение cookie и связанное с ним значение cookie.

Realm использует значение cookie для поиска личности и создания соответствующего Принципала. Принципал, которого вы возвращаете, не должен иметь то же имя пользователя, что и первый параметр функции входа, он может вернуть любого Принципала, которого он хочет.

+0

Не уверен, что я вас понимаю. – shep

Смежные вопросы