фиксация сессии - удалить сессию после входа в систему и создать новую сессию - но пользователь больше не авторизуется - PullRequest
6 голосов
/ 23 марта 2012

Я использую jsf2.0 и java ee6 на JBoss AS 7

У меня есть LoginController.java, похожий на это:

@ManagedBean(name = "loginController")
@SessionScoped
public class LoginController implements Serializable{

    private static final long serialVersionUID = 1119172305268193508L;

    @Inject
    private UserProvider userProvider;

    @PostConstruct
    public void initNewUser() {
        user = new User();
    }

    private User user;

    private String accountName;

    private String password;

    public String ownLogin() throws Exception {

        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance()
                .getExternalContext().getRequest();


        if (accountName != null) {
            try {


                if (exists(accountName)) {

                    user = userProvider.findUserByAccountName(accountName);

                    if (verifyPassword(user, password)) {

                        userProvider.saveChangedUser(user);


                        // OWASP SAYS: after login, destroy the session make a new one 
                        // a so called handover
                        // Destroy the session
                        FacesContext facesContext = FacesContext.getCurrentInstance();

                        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
                        if(session != null){
                            session.invalidate();
                        }
                        // create new session after logout
                        session = (HttpSession) facesContext.getExternalContext().getSession(true);
                    setLogin(true);
            }                   
    }

/* some getters and setters */

}

В целях безопасности OWASP сообщает, что после входа в систему сеансы должны быть удалены (см .: V3.7 )

я делаю это в своем коде на этом этапе:

FacesContext facesContext = FacesContext.getCurrentInstance();

                            HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
                            if(session != null){
                                session.invalidate();
                            }
                            // create new session after logout
                            session = (HttpSession) facesContext.getExternalContext().getSession(true);

Сначала я удаляю старый сеанс, затем создаю новый сеанс.
После этого я установил логин true ...

Конечно, после выполнения всего кода пользователь не вошел в систему, потому что LoginController управлялся в старой области сеанса - и в новой области сеанса есть новый LoginController в области без зарегистрированного пользователя ...

Есть ли способ добавить новый LoginController в новый сеанс после создания?

Или как обычно это сделать?

1 Ответ

4 голосов
/ 23 марта 2012

Когда вы аннулируете сеанс, все его атрибуты будут уничтожены к концу ответа.Однако вы устанавливаете состояние входа в систему для экземпляра bean-объекта области действия, который живет только в старом сеансе.

В основном вам нужно вручную воссоздать bean-объект сессионной области и поместить его в новый сеанс после аннулирования.

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.invalidateSession();
LoginController loginController = new LoginController();
loginController.setUser(user);
externalContext.getSessionMap().put("loginController", loginController);

(смотрите, нетнекрасиво javax.servlet импортирует больше!)

Кстати, когда вы идете этим путем, вы также можете просто сделать свой LoginController bean-объект в области видимости и иметь дело с User только в сеансе.

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.invalidateSession();
externalContext.getSessionMap().put("user", user);

(он будет доступен #{user} по всему контексту EL, в том числе в управляемых свойствах; необязательно должен быть управляемым компонентом JSF)

...