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>
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.
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 ...".
Ak používate Firefox, postup je nasledujúci: Menu -> Options -> záložka "Privacy", odkaz "remove individual cookies".
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 AuthenticatedWebSession, 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 AuthenticatedWebSession 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.
BasicAuthenticationSession.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 AuthenticatedWebSession, 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.