Tämä on osa PHP-projektia.
Sainpas tehtyä myös tämän kirjautumiskriptin... Tämä on nyt sitten väännetty olioilla, sillä halusin päästä niidenkin kanssa leikkimään eli PHP4:ää tämä ei nyt tue, mutta voisin tietysti tehdä oman luokan sitä varten. Mielestäni koodista tuli näin varsin yksinkertainen ja selkeä ja ainakin se toimii. Toivon kuitenkin etenkin tuosta luokkarakenteesta palautetta, sillä luokat ja oliot eivät ole ennestään ihan niin tuttuja.
Sitten hieman tästä skirptistä:
Kirjautumistiedot on tallennettu sellaisessa muodossa tiedostoon, että tunnuksesta, salasanasta sekä jostain suolasta luodaan sha1-hash eli siis näin:
<?php sha1($tunnus.$salasana.$suola) ?>
Testisivu löytyy täältä.
Sorsat taas täältä.
Testisivulle on tehty kaksi tunnus-salasana-paria ja ne ovat:
demo, demo
demo1, demo1
Itselläni tämä toimi, mutta ei olisi ensimmäinen kerta kun istunnot aiheuttavat ongelmia... Mutta jos ongelmia tulee niin bugi-raporttia siitä :)
Kaikkia hasheja en lataisi kerralla muistiin, koska jos niitä on paljon niin se on hidasta ja PHP:n memory_limit
-asetus saattaa tulla täyteen. Tallentaisin ennemmin muuttujaan tiedostokahvan, jota voidaan käydä läpi tarvittaessa.
Tiedostossa Login.class.php
, funktiossa login
; staattinen funktiokutsu on turha:
<?php Login::setSessions(); => $this->setSessions();
Luokasta ei nykyisessä toteutuksessa ole hyödytty suuremmin. Tästä saisi mukavan luokkatoteutuksen siten, että luotaisiin esimerkiksi kaksi pääluokkaa: istunto ja käyttäjä. Istutoluokasta voitaisiin periä eri istuntotyyppejä ja käyttäjäluokasta eri käyttäjätasoja. Tarvittaessa erikseen vielä luokka ryhmä, jos halutaan laajempaa toteutusta.
Tietoturvassa olisi vielä parantamisen varaa. Suosittelen tutustumaan Mureakuhan hyvään oppaaseen aiheesta, etenkin kohtiin Sessiot ja CSRF.
Yritä suunnitella ohjelmat siten, ettei tulostuksen puskurointia tarvitse käyttää.
Voisitko hieman täsmentää eli siis tarkoititko, että luon luokan sekä istuntojen käsittelyä varten sekä käyttäjiä varten ja niiden pohjalta teen varsinaisen skriptin vai tarkoititko että näiden kahden muun luokan avulla (periyttäen) teen kolmannen luokan, joka korvaisi nykyisin Login-luokan ja sen pohjalta teen skriptin...
Anteeksi tämä tyhmyyteni, nämä luokat eivät ole tosiaankaan vahvinta alaa.
Luokkien ideahan on jakaa koodi loogisiin kokonaisuuksiin ja tarjota loogiset suhteet toimintojen välille. Vain yhden luokan käyttäminen ja siihen kaikkien toimintojen tunkeminen ei ole kovinkaan hyödyllistä, saati sitten järkevääkään.
Alla klassinen esimerkki luokista (olioista):
<?php class Elain { public function liiku() { echo "Liikun kuten mikä tahansa eläin\n"; } public function syo() { echo "Syön kuten mikä tahansa eläin\n"; } } class Kala extends Elain { public function syo() { echo "Syön kalamaisesti\n"; } } class Kultakala extends Kala { public function syo() { echo "Syön kultakalamaisesti\n"; } } class Lintu extends Elain { public function syo() { echo "Syön lintumaisesti\n"; } } $elukat = array(new Elain(), new Kala(), new Kultakala(), new Lintu()); foreach ($elukat as $elukka) { $elukka->liiku(); $elukka->syo(); echo "\n"; }
Näissä asioissa kannattaa ottaa kynä käteen ja ruveta miettimään mitä yhtäläisyyksiä asioilla on. Luokkien hyödyntämistä tähän (kirjautumiseen) riippuu siitä, miten laajan systeemin haluat. Itse en lähtisi luokilla toteuttamaan pientä kirjautumisjärjestelmää. Käyttäisin luokkia sellaiseen, jossa on eri käyttäjätasoja, eri pääsyalueita ja muita tällaisia.
Tossa on kyllä pointtia :D
Ei auta muuta kun ottaa sitten se kynä käteen ja alkaa niitä yhtäläisyyksiä metsästämään.
Ihan noin yleisesti ottaen, mikä on paras tapa lähteä toteuttamaan jotain suurempaa kokonaisuutta esim. CMS:ssää tai joitan vastaavaa? Onko siinäkin fiksuinta ensin miettiä tarpeelliset ominaisuudet ja sitten vain jakamaan samantyyppisen asiat omiksi pienemmiksi kokonaisuuksiksi?
Isommissa kokonaisuuksissa yleisesti mietitään ominaisuuksia yleisellä tasolla ja piirrellään vuokaavioita ominaisuuksien välisistä yhteyksistä. Kun ominaisuuksia on haluttu määrä ruvetaan miettimään, miten ne voitaisiin jakaa järkevästi ja mitkä osat ohjelmassa toteuttavat ne. En ole tosin kovinkaan hyvä antamaan tällaisia neuvoja, koska itselläni jää useasti se suunnitteluvaihe mystisesti pois. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.