Связывание сущности пользователя и принципала GlassFish

у меня есть класс сущности Пользователь , который содержит такую ​​информацию, как имя пользователя, имя, фамилия и пароль, и у меня есть сервер 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);
}

Это правильный путь?

Спасибо!

Редактировать:

Спасибо за ввод! Я немного подумал об этом, и хотя мне кажется, что перенос паролей в другую таблицу на данный момент слишком сложен для меня, я все же думаю, что могу решить некоторые проблемы, разделив UserController в @RequestScoped AuthenticationController и урезанный @SessionScoped UserController .

AuthenticationController будет иметь поля emailAddress и пароль , связанные полями emailAddress и пароля веб-страницы. Он дополнительно будет содержать public void Authenticate () для аутентификации пользователя и впоследствии отбрасывания учетных данных. Затем @SessionScoped UserController может выполнить привязку к соответствующему объекту User без необходимости знать пароль. Фактически, я считаю, что смогу полностью удалить поле пароля из пользователя .

7
задан Laurens 25 July 2011 в 19:56
поделиться