niedziela, 20 lutego 2011

Autentykacja zarządzana przez kontener Java EE dla aplikacji JSF 2.0 z wykorzystaniem Servlet 3.0 API

Do napisania niniejszego postu skłoniło mnie spostrzeżenie, że większość śledzących nowości w Java EE 6 (włącznie ze mną oczywiście) skupiła się na adnotacjach. Tymczasem w Servlet API 3.0 weszło bardzo dobre rozwiązanie - a mianowicie - możliwość programowej autentykacji do kontenera JEE. Dotychczas stroną logowania mogła być jedynie zwykła strona HTML z polami j_username, j_password i formularzem z akcją j_security_check. Dzięki wprowadzonym nowościom, strona logowania może być już teraz stroną JSF. Ale zacznijmy od początku. Poniżej kroki konfiguracji GlassFish'a:




















Utworzenie nowego realm'a

Dodanie użytkowników i ról
Struktura mojej aplikacji demo
Plik sun-web.xml
Plik web.xml
Strona logowania
Managed bean z funkcją odpowiedzialną za autentykację

import javax.faces.application.FacesMessage;;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

@ManagedBean
@RequestScoped
public class LoginBean {

    private String inputLogin;
    private String inputPassword;

    public String loginAction(){

        FacesContext ctx = null;
        ExternalContext ectx = null;
        HttpServletRequest request = null;
        FacesMessage msg = null;
        String action = null;

        try {
                ctx = FacesContext.getCurrentInstance();
                ectx = ctx.getExternalContext();
                request = (HttpServletRequest) ectx.getRequest();
                request.login(inputLogin, inputPassword);
                action = "/protected/welcome.xhtml";

        } catch (ServletException ex) {

            ctx = FacesContext.getCurrentInstance();
            msg = new FacesMessage(ex.getMessage());
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            ctx.addMessage(null, msg);

        }

       return action;
    }

    // getters and setters
    
}

Jak widać nowością jest funkcja login() wywoływana na obiekcie HttpServletRequest. W przypadku niepoprawnego logowania otrzymamy w wyjątek, który można obsłużyć dowolnym faces'owym komunikatem.









Analogicznie, możemy wywołać funkcję logout(), przy czym należy pamiętać, że wylogowanie musi się odbywać z redirect'em
@ManagedBean
@RequestScoped
public class WelcomeBean {


    public String logoutAction(){

        FacesContext ctx = null;
        ExternalContext ectx = null;
        HttpServletRequest request = null;
        String action = null;

        try {
                ctx = FacesContext.getCurrentInstance();
                ectx = ctx.getExternalContext();
                request = (HttpServletRequest)ectx.getRequest();
                request.logout();
                action = "/faces/index.xhtml?faces-redirect=true";

        } catch (ServletException ex) {
            ex.printStackTrace();
        }

      return action;
    }
}

Pobierz projekt (NetBeans 6.9.1)

1 komentarz:

  1. Dzięki za info :)
    Będę musiał przerobić swoją aplikację

    OdpowiedzUsuń