Java >> Java tutorial >  >> Tag >> HTTP

Wicket HTTPS-vejledning, del to:Oprettelse af sikre formularer

Mit tidligere blogindlæg beskrev, hvordan du kan oprette sikre websider ved at bruge Apache Wicket-rammen. Men da en almindelig anvendelse af en webapplikation er at give en sikker kanal til behandling af oplysninger, er mit tidligere blogindlæg ikke særlig nyttigt uden yderligere oplysninger. Dette blogindlæg vil give en del af den nødvendige information ved at beskrive, hvordan du kan oprette sikre formularer ved at bruge de teknikker, der er beskrevet i den første del af mit Wicket HTTPS-selvstudie.

Påkrævede trin

En sikker formular kan oprettes ved at følge disse trin (det første og andet trin er beskrevet i mit tidligere blogindlæg, så jeg springer dem blot over her):

  1. Aktivering og konfiguration af HTTPS-understøttelse af Apache Wicket
  2. Oprettelse af en sikker formular
  3. Tilføjelse af den sikre formular til en sikker side

Jeg besluttede at beskrive det tredje trin ved at oprette en simpel loginformular, som gemmer brugernavnet til session efter et vellykket login. De relevante dele af eksemplet er beskrevet i det følgende.

Aktivering og konfiguration af HTTPS-understøttelse af Apache Wicket

Aktivering og konfiguration af HTTPS-understøttelse af Apache Wicket kan opdeles i to mindre faser:

  • Oprettelse af en tilpasset sessionsimplementering
  • Oprettelse af en tilpasset applikationsklasse

Jeg vil beskrive disse faser med flere detaljer næste gang.

Først oprettede jeg en sessionsimplementering, som kan gemme brugernavnet på en godkendt bruger. Jeg udvidede simpelthen org.apache.wicket.protocol.http.WebSession klasse og tilføjede de nødvendige metoder til at manipulere brugernavnsoplysningerne. Jeg tilføjede også en statisk get() metode, som bruges til at få en reference til sessionsimplementeringen. Kildekoden til min sessionsimplementering findes i følgende:

package net.kainulainen.wickethttps;

import org.apache.wicket.Request;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.WebSession;

public class WicketHttpsSession extends WebSession {

    private String authenticatedUsername;

    public WicketHttpsSession(Request request) {
        super(request);
    }

    public static WicketHttpsSession get() {
        return (WicketHttpsSession) Session.get();
    }

    public String getAuthenticatedUsername() {
        return authenticatedUsername;
    }

    public void setAuthenticatedUsername(String authenticatedUsername) {
        this.authenticatedUsername = authenticatedUsername;
    }
}

For det andet oprettede jeg en brugerdefineret applikationsklasse, som overskriver newSession(Request request, Response response) metoden for org.apache.wicket.protocol.http.WebApplication-klassen . Denne metode returnerer en ny forekomst af WicketHttpsSession klasse, og sikrer, at Wicket bruger min sessionsimplementering. Kildekoden til min applikationsklasse er tilgængelig i følgende:

package net.kainulainen.wickethttps;

import org.apache.wicket.Request;
import org.apache.wicket.Response;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.protocol.https.HttpsConfig;
import org.apache.wicket.protocol.https.HttpsRequestCycleProcessor;
import org.apache.wicket.request.IRequestCycleProcessor;

public class WicketApplication extends WebApplication
{
    //Remember to enable and configure the HTTPS support of Apache Wicket as well!!    

    @Override
    public Session newSession(Request request, Response response) {
        return new WicketHttpsSession(request);
    }
}

Oprettelse af en sikker formular

Oprettelse af en sikker formular har to mindre faser:

  • Oprettelse af en DTO til lagring af loginoplysninger
  • Oprettelse af den faktiske formularklasse, som behandler loginoplysningerne

Disse trin er forklaret med flere detaljer i dette afsnit.

Først oprettede jeg en simpel DTO, som bruges til at gemme de loginoplysninger, som brugeren har indtastet. Kildekoden til DTO er angivet i følgende:

package net.kainulainen.wickethttps.login;

import java.io.Serializable;

public class LoginDTO implements Serializable {
    private String username;
    private String password;

    public LoginDTO() {

    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

For det andet oprettede jeg en simpel formularklasse, som behandler de angivne loginoplysninger. Kildekoden til loginformularen er angivet i følgende:

package net.kainulainen.wickethttps.login;

import net.kainulainen.wickethttps.HomePage;
import net.kainulainen.wickethttps.WicketHttpsSession;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;

public class LoginForm extends StatelessForm<LoginDTO> {

    private static final String MESSAGE_KEY_LOGIN_FAILED = "error.login.failed";

    private static final String WICKET_ID_FEEDBACK = "feedback";
    private static final String WICKET_ID_USERNAME = "username";
    private static final String WICKET_ID_PASSWORD = "password";

    public LoginForm(String id) {
        super(id, new CompoundPropertyModel(new LoginDTO()));
        init();
    }

    public LoginForm(String id, IModel iModel) {
        super(id, iModel);
        init();
    }

    private void init() {
        add(new FeedbackPanel(WICKET_ID_FEEDBACK));
        add(new TextField(WICKET_ID_USERNAME)
                .setRequired(true)
        );
        add(new PasswordTextField(WICKET_ID_PASSWORD)
                .setRequired(true)
        );
    }

    @Override
    protected void onSubmit() {
        LoginDTO credentials = this.getModelObject();

        String username = credentials.getUsername();
        String password = credentials.getPassword();

        if (isValidUser(username, password)) {
            processSuccessfulLogin(username);
        } else {
            processFailedLogin();
        }
    }

    //A dummy way to test, if the username and password are correct. In real life, 
    //this method would naturally look quite different.
    private boolean isValidUser(String username, String password) {
        if (username.equals("foo") && (password.equals("bar"))) {
            return true;
        }
        return false;
    }

    private void processSuccessfulLogin(String username) {
        WicketHttpsSession currentSession = WicketHttpsSession.get();
        //Invalidates the current session and creates a new secure session.
        //The created secure session cannot be accessed when using http
        //protocol. This option should be used when only https protocol is
        //used after the user has logged in.
        //currentSession.replaceSession();
        currentSession.setAuthenticatedUsername(username);
        forwardUserToHomePage();
    }

    private void forwardUserToHomePage() {
        this.setResponsePage(HomePage.class);
    }

    private void processFailedLogin() {
        error(getString(MESSAGE_KEY_LOGIN_FAILED));
    }
}

Tilføjelse af den sikre formular til en sikker side

Det sidste trin er at tilføje den oprettede formularklasse til en sikker side. Dette sikrer, at formularindsendelsen sendes ved hjælp af HTTPS-protokollen. Kildekoden til den sikre side er tilgængelig i følgende:

package net.kainulainen.wickethttps.login;

import net.kainulainen.wickethttps.HomePage;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.protocol.https.RequireHttps;

@RequireHttps
public class SecureLoginPage extends WebPage {

    private static final String WICKET_ID_HOMEPAGE_LINK = "homepageLink";
    private static final String WICKET_ID_LOGINFORM = "loginForm";

    public SecureLoginPage(PageParameters parameters) {
        super(parameters);
        init();
    }

    protected void init() {
        add(new BookmarkablePageLink(WICKET_ID_HOMEPAGE_LINK, HomePage.class));
        add(new LoginForm(WICKET_ID_LOGINFORM));
    }
}

Hvad er det næste?

Ved at følge instruktionerne i dette blogindlæg kan du oprette en sikker loginformular, som indsendes ved at bruge HTTPS-protokollen. Jeg har også lavet et simpelt eksempelprojekt (Projektet er testet med Apache Wicket 1.4.15), som forhåbentlig vil hjælpe dig med at forstå begreberne beskrevet i dette blogindlæg. Du kan køre eksempelprojektet ved at bruge mvn jetty:run-war kommando (Husk først at installere Maven).

Den tredje del af Wicket HTTPS-vejledningen beskriver en situation, hvor formularen føjes til en ikke-sikker side, men formularindsendelsen skal ske ved at bruge HTTPS-protokollen.


Java tag