2016-03-20 28 views
0

JSF 2.2とPrimeFaces 5.3を使用してログイン機能画面を構築しています。しかし、私には問題があります。ユーザーがユーザー名とパスワードを入力したが、そのうちの1つが間違っているとします。それが起こると、ユーザーにエラーメッセージ "Username and/or password is incorrect"が表示されます。問題は、その瞬間にセッションを保存していることです。私は、ユーザーが正常にログインしたら、セッションを保存したい私のログインフォームは次のようになります。JSFログインフォーム - ログインが成功するとセッションを保存する

コントローラクラス(loginController)は、次のようになります
<f:metadata> 
     <f:viewParam name="tipo" value="#{loginTipoController.tipo.tipo}" /> 
    </f:metadata> 

    <h:form id="login"> 

     <p:focus context="login" /> 

     <p:graphicImage url="img/logog.JPG" width="448" height="119" /> 

     <p>Digite su usuario y password.</p> 

     <p:outputLabel for="usuario" value="Usuario:" /> 

     <p:inputText id="usuario" value="#{loginController.login.username}" /> 

     <p:outputLabel for="password" value="Password:" /> 

     <p:password id="password" value="#{loginController.login.password}" /> 

     <p:messages autoUpdate="true" for="usuarioPassword" /> 

     <p:commandButton value="Login" action="#{loginController.login()}" /> 

     <p:button value="Regresar" outcome="index.jsf" /> 

    </h:form> 

  1. @ManagedBean @SessionScoped パブリッククラスLoginController {

    private Login login; 
    
        private LoginTipo loginTipo; 
    
        private LoginService service; 
    
        public Login getLogin() { 
         return login; 
        } 
    
        public void setLogin(Login login) { 
         this.login = login; 
        } 
    
        public LoginService getService() { 
         return service; 
        } 
    
        public void setService(LoginService service) { 
         this.service = service; 
        } 
    
        @PostConstruct 
        public void init() 
        { 
         login = new Login(); 
    
         service = new LoginService(); 
        } 
    
        public String login() 
        { 
         FacesContext facesCont = FacesContext.getCurrentInstance(); 
    
         loginTipo = facesCont.getApplication().evaluateExpressionGet(facesCont, 
           "#{loginTipoController.tipo}", LoginTipo.class); 
    
         login = service.login(login.getUsername(), login.getPassword(), loginTipo.getTipo()); 
    
         if(login.getMensaje_id() != 0) 
         { 
          FacesContext.getCurrentInstance().addMessage("usuarioPassword", 
            new FacesMessage(login.getMensaje())); 
    
          ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
    
          ec.invalidateSession(); 
    
          return ""; 
         } 
         else 
         { 
          return login.getMensaje(); 
         } 
        } 
    
        //logout method 
        public void logout() 
        { 
         ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
    
         ec.invalidateSession(); 
    
         try 
         { 
          ec.redirect(ec.getRequestContextPath() + "/index.jsf"); 
         } 
         catch (IOException e) 
         { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
    
    } 
    

LoginService()クラスコードは、単にデータベースに行き、ユーザーが存在するかどうかをチェックするだけなので、入れません。

コントローラクラスのlogin()メソッドでは、ユーザーがログインに失敗したときに、ユーザーがログインできなかったことを通知します。エラーメッセージが表示されます。その後、私は次のコードを持っています:

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 

ec.invalidateSession(); 

私はセッションを破壊しています。私はそれをしなければならないことを避けたい!

答えて

1

基本的には、ログイン時にログインフォームをクリアしたいと思うことを理解しています。フォームデータを表すBeanプロパティをクリアするだけで済みます。

login = new Login(); 
loginTipo = null; 

Bean自体は必ずしもセッションスコープである必要はありません。リクエストスコープにすることができ、ユーザーオブジェクトを手動でセッションに入れることができます。私はLoginがそのユーザーを表していることを理解しています。ログインに成功したら、その場合には、次のように実行します。

ec.invalidateSession(); 
ec.getSessionMap().put("login", login); 
return "/userhome?faces-redirect=true"; 

ログインしているユーザー#{login}としてセッションスコープで利用できるようになります。

セッション直前のセッションを明示的に無効にすることは、セッション固定攻撃を回避するための良いセキュリティプラクティスです。すべてのログイン失敗時にそれを無効にすることは本当に不要です。

+0

上記のコードで、ec.getSessionMap()。put()は基本的に私のbeanをsessionScopeにしたのと同じように動作しますか? – Erick

+0

これは正しいです。 – BalusC

関連する問題