У меня есть класс сущностей User
, который содержит такую информацию, как имя пользователя, имя, фамилия и пароль, и у меня есть настройки сервера GlassFish 3.1 для выполнения аутентификации. Все идет нормально. После того, как контейнер аутентифицировал пользователя, мне нужно каким-то образом связать принципал с действительным объектом User. В конце концов, GlassFish говорит мне, что пользователь "laurens" прошел аутентификацию, он не дает мне соответствующую User
сущность.
Для этого я написал управляемый компонент JSF UserController
. Я хотел бы знать, является ли это правильным способом поиска реальной сущности, и есть ли какие-либо очевидные ловушки, которых я не вижу.
UserController
имеет следующие поля:
@EJB
private UserFacade userFacade;
private User user;
userFacade
- это сеансный компонент без сохранения состояния, который сохраняется и находит User
экземпляры. Поле user
используется страницей JSF для получения и установки свойств пользователя.
Я использую следующий метод для выполнения привязки, сопровождаемый двумя вспомогательными методами:
@PostConstruct
private void init() {
try {
user = userFacade.find(getUserPrincipal().getName());
} catch (NullPointerException ex) {
// Intentionally left empty -- User is not logged in.
}
}
private HttpServletRequest getHttpServletRequest() {
return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
}
private Principal getUserPrincipal() {
return getHttpServletRequest().getUserPrincipal();
}
Следующие методы используются страницей JSF для определения того, какие компоненты отображать (если пользователь уже аутентифицирован, тогда нет необходимости показывать форму входа), аутентифицировать пользователя, если нажата кнопка «Войти», или зарегистрироваться как новый пользователь при нажатии кнопки «Зарегистрироваться».
public boolean isAuthenticated() {
return getUserPrincipal() != null;
}
public void authenticate() {
try {
getHttpServletRequest().login(user.getEmailAddress(), user.getPassword());
} catch (Exception ex) {
// TODO: Handle failed login attempt
}
}
public void register() {
userFacade.create(user);
}
Правильный ли это путь?
Спасибо!
Edit:
Спасибо за вклад обоих! Я немного подумал об этом, и хотя я думаю, что перенести пароли в другую таблицу для меня пока слишком сложно, я думаю, что могу решить некоторые проблемы, выделив UserController
в @RequestScoped
AuthenticationController
и урезанный @SessionScoped
UserController
.
AuthenticationController
будет иметь поля emailAddress
и password
, связанные полями emailAddress и пароля веб-страницы. Кроме того, он будет содержать public void authenticate()
для аутентификации пользователя и последующего удаления учетных данных. Затем @SessionScoped
UserController
может связываться с соответствующим объектом User
без необходимости знать пароль. На самом деле, я считаю, что смогу удалить поле пароля из User
в целом.