IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

11. diel - Wicket - Prihlasovanie

V minulej lekcii sme pridali editačné stránku. V tejto lekcii upravíme hlavnú stránku tak, aby sa na ňu vytvorené príspevky zobrazovali, a tiež zaistíme, aby príspevky mohol pridávať iba administrátor (prihlásený užívateľ).

Zobrazenie príspevkov na hlavnej stránke.

HomePage.java

public HomePage() {

    // Creates  model.
    IModel<List<Note>> model = new AbstractReadOnlyModel<List<Note>>() {
        @Override
        public List<Note> getObject() {
            NoteDao dao = new NoteDaoImpl();
            List<Note> notes = dao.getAllNotes();
            return notes;
        }
    };

    // Creates repeater.
    ListView<Note> lv = new ListView<Note>("lv", model) {
        @Override
        protected void populateItem(ListItem<Note> item) {
            Note note = item.getModelObject();

            Label text = new Label("text", note.getText());
            text.setEscapeModelStrings(false);
            item.add(text);

            Label date = new Label("date", note.getCreatedDate().toString());
            date.add(new AttributeAppender("class", Model.of("date")));
            date.setEscapeModelStrings(false);
            item.add(date);
        }
    };
    add(lv);
}

HomePage.html

<wicket:extend>

    <div wicket:id="lv" class="message">
        <div wicket:id="text"></div>
        <div wicket:id="date"></div>
    </div>

</wicket:extend>
Apache Wicket
Apache Wicket

Teraz nám zostáva zabezpečiť, aby príspevky mohol pridávať len overený, užívateľ.

Autentifikácia je overenie toho, kto ste (prihlásenie užívateľa do aplikácie). Autorizácia overuje, aké máte práva (môže napr. Prezerať súbory, ale nemôžete ich mazať).

Session

Protokol http je bezstavový. To znamená, že každý požiadavka od prehliadača na webovú stránku je pre neho jedinečný. Neuchováva si žiadnu históriu. Aby bolo možné spárovať jednotlivých užívateľov a ich požiadavky na stránky (a uchovávať históriu) existuje niekoľko techník. Jednou z nich je použitie cookies, čo sú malé súbory na disku používateľa, ktoré obsahujú textové hodnoty vo forme kľúč -> hodnota. Pri prvom dotaze na stránku od užívateľa sa na serveri vytvorí sedenie (session), čo je objekt, ktorý uchováva informácie o užívateľovi na strane servera. Tento objekt má jedinečné číslo (identifikátor). Okrem požadovanej stránky sa užívateľovi okrem kódu stránky pošle aj súbor cookie, ktorý obsahuje i id, ktoré zodpovedá id sedenie. S každým ďalším požiadavkou na server sa odosiela aj cookie a server z neho zistí id sedenie. Takto je potom schopný rozpoznať jednotlivých užívateľov. Do session sa ukladá napríklad aj jazykové nastavenia (locale).

Wicket si ukladá (pomocou serializácie) aj jednotlivé verzie užívateľom navštívených stránok, aby sa užívateľ mohol vrátiť späť. Identifikátor verzie (nazývaný pageId) môžete vidieť v adresnom riadku prehliadača.

Apache Wicket
Apache Wicket
Apache Wicket
Apache Wicket

Ak používate prehliadač Chrome, cookies si zobrazíte nasledujúcim spôsobom: Menu -> Settings -> Show advanced settings -> sekcia "Privacy", tlačidlo "Content settings" -> sekcia "Cookies", tlačidlo "All cookies and site data ...".

Apache Wicket

Ak používate Firefox, postup je nasledujúci: Menu -> Options -> záložka "Privacy", odkaz "remove individual cookies".

Apache Wicket

V našom prípade, bude môcť príspevky pridávať ktokoľvek, kto sa prihlási (zaloguje). Na prihlásenie bude treba používateľské meno a heslo. Vzhľadom k tomu, že sa jedná o náš osobný web, bude nám stačiť jedno používateľské meno a heslo, ktoré bude napevno v kóde.

Pre túto funkcionalitu budeme potrebovať knižnice, ktoré už nie sú súčasťou balíčka wicket-core. Do pom.xml pridáme ďalšie závislosť.

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-auth-roles</artifactId>
    <version>${wicket.version}</version>
</dependency>

Vlastné session

Najskôr si vytvoríme vlastný session, ktorá bude vedieť autentifikáciu. Naša session bude dediť od Wicket Authenticated­WebSession, ktorá má ako predka Session (ktorú sme doteraz nevedomky používali, a ktorá uchovávala napríklad verzie stránok - pozri odsek s názvom Session). Z Authenticated­WebSession musíme implementovať dve metódy:

  • authenticate ()
  • getRoles ()

Pre nás dôležitá je metóda authenticate (). Druhou metódy potrebovať nebudeme a necháme ju vracať null.

Metóda authenticate () má dva parametre: username a password a budeme ju používať pre autentifikáciu. Vzhľadom k tomu, že sa jedná o náš blog a príspevky budeme pridávať iba my, použijeme ten najjednoduchší spôsob.

Je určite možné vytvoriť v databáze tabuľku s užívateľskými menami heslami, tie načítavať a porovnávať s údajmi zadanými používateľom. To už nechám na každom z vás.

BasicAuthenti­cationSession­.java

public class BasicAuthenticationSession extends AuthenticatedWebSession {
    private static final String USERNAME = "admin";
    private static final String PASSWORD = "1234";

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

    @Override
    public boolean authenticate(String username, String password) {
        if (username.equals(USERNAME) && password.equals(PASSWORD)) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public Roles getRoles() {
        return null;
    }
}

Abstraktné trieda Authenticated­WebSession, z ktorej dedíme, má property boolean signedIn, ktorá v sebe uchováva to, či je užívateľ byť overený (prihlásený) alebo nie. Tým, že sa používateľ prihlási (je zavolaná naša implementovaná metóda authenticate ()) sa zároveň nastaví hodnota premennej signedIn. Ak chce používateľ zobraziť stránky, ktoré vyžadujú autorizáciu, skontroluje sa hodnota tejto premennej.

Prihlasovacia stránka

Naše prihlasovacia stránka sa bude skladať z formulára s políčkom (text field) pre zadanie mena používateľa, políčka pre heslo a tlačidlá pre odoslanie.

LoginPage.java

public class LoginPage extends BasePage {
    private String username;
    private String password;

    public LoginPage() {
        setDefaultModel(new CompoundPropertyModel(this));

        FeedbackPanel feedback = new FeedbackPanel("feedback");
        add(feedback);

        Form loginForm = new Form("loginForm") {
            @Override
            protected void onSubmit() {
                if (AuthenticatedWebSession.get().signIn(username, password)) {
                    continueToOriginalDestination();
                }
            }
        };
        add(loginForm);

        TextField usernameTF = new TextField("username", new PropertyModel<String>(this, "username"));
        usernameTF.setRequired(true);
        loginForm.add(usernameTF);

        PasswordTextField passwordTF = new PasswordTextField("password", new PropertyModel<String>(this, "password"));
        loginForm.add(passwordTF);
    }

    @Override
    public void setTitleModelObject() {
        titleModel.setObject(getString("title.loginPage"));
    }
}

LoginPage.html

<wicket:extend>
<h2><wicket:message key="text.login"/></h2>

<div wicket:id="feedback"></div>

<form wicket:id="loginForm">
    <input type="text" wicket:id="username" id="username"/><label for="username"><wicket:message key="form.username"/></label><br/>
    <input type="password" wicket:id="password" id="password"/><label for="password"><wicket:message key="form.password"/></label><br/>
    <input type="submit" wicket:message="value:form.submit"/>
</form>

</wicket:extend>

Pokračovanie v ďalšej lekcii.


 

Predchádzajúci článok
Wicket - JavaScript a CSS, pokračovanie
Všetky články v sekcii
Apache Wicket
Preskočiť článok
(neodporúčame)
Wicket - Prihlasovanie, pokračovanie
Článok pre vás napísal vita
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
vita
Aktivity