Login Class

Meitsi 14.11.05 17:47

Pienimuotoinen kirjautumisluokka (Hieman lisää muokattu versio)

 Tekstiversio  Arvo: -1 (1 ääntä)  Äänestä: +  -
// user.inc

<?
class UserClass
{
        var $user_id = -1;
        var $username = "";
        var $firstname = "";
        var $surname = "";
       
        function User($id, $login, $f_name, $s_name)
        {
                $this->user_id=$id;
                $this->username=$login;
                $this->firstname=$f_name;
                $this->surname=$s_name;
        }       

        function getUserInfo($user)
        {
                // Kysely id:n, etunimen ja sukunimen hakemista varten kannasta

                $q = "SELECT id,firstname, surname FROM user_user WHERE user='".mysql_real_escape_string($user)."'";
               
                $result = mysql_query($q);
               
                // Haetaan tiedot taulukkoon
                $l = mysql_fetch_row($result);
               
                //Palautetaan taulukko toiselle funktiolle
                return $l;
       
               
        }
        function getPassword($user)
        {
                // Tietokantakysely
                 $q = "SELECT passwd FROM user_user WHERE user='".mysql_real_escape_string($user)."'";
               
                $result= mysql_query($q) or die("Error".mysql_error());
       
               
                $l = mysql_fetch_row($result);
                return $l[0];


        }
       
        function checkPasswords($given_password, $password_from_database, $user)
        {
          
                // Jos annettu salasana oikein, palautetaan true, muutoin null
                if($given_password == $password_from_database)
                 {
               
                        return true;
                 }

                return null;
         
        }

}


function loginUser($user, $password)
{
        // Luodaan $user_class niminen luokka
        $user_class = new UserClass();

        // Haetaan salasana kannasta
        $get_password = $user_class->getPassword($user);

        // Verrataan salasanoja
        $check_passwords = $user_class->checkPasswords($password,$get_password, $user);

        if($check_passwords == 1)
        {
                $user_info = $user_class->getUserInfo($user);
                return new UserClass($user_info[0], $user, $user_info[1], $user_info[2]);
        }
 

        return null;
}


?>

// config.php:hen seuraavat rivit

//Kirjautumis parametrit
define(LOGIN_NAME_PARAM, "loginname");
$loginname = $_POST[LOGIN_NAME_PARAM];

define(LOGIN_PASSWORD_PARAM, "loginpassword");
$loginpassword = $_POST[LOGIN_PASSWORD_PARAM];

// Käyttäjäobjektin nimi sessiossa
define(USER_LOGIN_SESSION_NAME, "logged_user");

// Sisäänkirjautuminen
if($loginname && $loginpassword)
{

   $user_object = loginuser($loginname, $loginpassword);
   
   if($user_object)
   {
       
        $HTTP_SESSION_VARS[USER_LOGIN_SESSION_NAME] = $user_object;
        //print $HTTP_SESSION_VARS[USER_LOGIN_SESSION_NAME];
   }
}

// Alustetaan kirjautumisobjekti //
$logged_user = $HTTP_SESSION_VARS[USER_LOGIN_SESSION_NAME];

---------------------------------------------------------------

Lisäksi kirjautumisen tarkistus
if(!is_object($logged_user))
{

        header("location: kirjautumisruutuun");
        exit("");
} 

raspi 18:08 14.11.05 
Lisää mysql_real_escape-string-funktio jokaiseen kyselyyn.
Ezku 23:19 14.11.05 
Hetttkinen. Luokkien käyttämisestä bonusta, mutta miinusta huonosta suunnittelusta - miksi User-luokkia on kaksi? Miksi proseduraalisia funktioita? Yritys jää tällaisenaan hieman sillisalaatiksi. :)
Irksome 09:00 15.11.05 
Nipotusta hieman, mutta ei toki luoda uutta $user_class -nimistä luokkaa, vaan luokan UserClass ilmentymä eli olio :)
editoitu: 11:24 15.11.05
harja 11:22 15.11.05 
No tämäpäs oli aika... mielenkiintoinen. Miksi ei tuo User-luokka voi hoitaa noita kaikkia toiminnallisuuksia? Tällaisenaanhan tämä ei oikein ole kauhan hyvää olio-ohjelmointia. Jos tämän tekisi paremmin, voisi käyttö olla jotain tällaista:

$userManager = new UserManger(session_id());

if(!$userManager->isAuthenticated())
{
  // Authenticate hoitaa myös sessiopuolen ja muut hässäkät
  if(!($userInfo = $userManager->authenticate($_POST["user"], $_POST["password"])))
  {
    // vaihtoehtoisesti myös authenticate voisi heittää tämän, mutta esimerkin vuoksi näinkin päin
    throw new AuthenticationException("Authentication error! Check username and password.");
  }
} else
{
  $userInfo = $userManager->get();
}

// täällä sitten tehdään jotain sheibeä, tulostetaan vaikka käyttäjän tiedot, sopivalla frameworkilla
$this->view->attach('userInfo', $userInfo);
$this->view->add('userdata.php');


Autentikoinnin voisi sitten hoitaa vaikka Filterissä (kts. vaikka Ezkun hyvä MVC-esimerkki) tai jossain muussa vastaavassa, niin koko muun applikaation ei tarvitsisi panikoida käyttäjän autentikoituvuudesta - se kun olisi hoidettu kaikkien puolesta. UserMangerilta sitten voi pyytää kaikki mahdolliset tiedot, mikäli tarvitsee kustomoida näkymää esim. käyttäjäkohtaisesti (oikeustasot, näkymät jne).