Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Rekisteröitynyt käyttäjä ja rekisteröitymäton käyttäjä

Sivun loppuun

Niksu [28.09.2009 21:53:05]

#

Oon tota hyödyntäen pyrkiny tekemään semmosen käyttäjätaso systeemin. Toimii oikeestaan ihan mukavasti yhtä pientä kohtaa lukuunottamatta.

https://www.ohjelmointiputka.net/koodivinkit/23878-php-kirjautuminen-sessioneilla

Ongelma on sellanen, että tiettyjen sivujen pitäisi näkyä jokaiselle käyttäjälle, mutta rekisteröityneille hieman erilaisena.

Se onnistuu kivasti vaikka jotenkin noin:

<?php
if (($_SESSION["sess_taso"]) and ($_SESSION["sess_tunnus"])) {
if ($_SESSION["sess_taso"] == 3) {
echo "Sallitaan lukeminen!";
}
else {
echo "Ei oikeuksia!";
}
}
?>

Varsinainen ongelma tulee vastaa siinä, että tuossa esimerkin tarkista.php näyttää aina lopulta kirjautumislomakkeen, enkä ole onnistunut "kiertämään" sitä millään.


ESIM.

----
Etusivu

Rekisteröidy tai kirjaudu sisään!
----

ja sitten kirjaudutaan -->

----
Etusivu

Kirjautuneena Pena!
----

Toivottavasti joku ymmärtää ja osaa auttaa, meinaa alkaa taas iteltä ideat loppua... :/

Hakoulinen [28.09.2009 22:13:44]

#

Laita hieman enemmän koodia näkyviin. Varmaankin pitäisi vain sisällyttää formin piirto jonkun ehdon sisään, jossa tarkistetaan onko kirjauduttu.

Niksu [28.09.2009 22:18:52]

#

Tossa linkissä on se koodivinkki, jonka kylkeen oon sitä tehny. Toki oon muokannu siihen et kantaan tulee tietty arvo tasoa varten ja tällee, mut muuten siin ei oo mitään eroavaisuuksia, eikä tonkaan pitäis vaikuttaa tähän.

Hakoulinen [29.09.2009 08:36:53]

#

Jos kerran ei ole muita eroavaisuuksia ja olet kantaan onnistuneesti tallentanut niin varmaankin seuraavan tyyppisellä koodilla:

if($_SESSION["sess_taso"] == 0) { //Eli jos kirjautumisen "taso" on kirjautumaton
//Tässä tulostat lomakkeesi.
}

PS. voit luoda session jo ennen kun käyttäjä on kirjautunut, jolloin vain asetat $_SESSION["sess_taso"]:ksi nollan, eli ei kirjautunut. Totta kai voisit myös verrata onko sessiota edes luotu, jos se luodaan vasta käyttäjän kirjauduttua.

Niksu [29.09.2009 09:35:36]

#

Niin, tossahan tosiaan tulee se ongelma, että käyttäjä jolla ei ole tunnusta, ei näe sivua kuitenkaan. Kyllä tuo seuloo sitten loppupeleissä mitä käyttäjä näkee ja mitä ei, mutta kuitenkin sen sivun perusasiat jokaisen pitäisi nähdä.

Metabolix [29.09.2009 11:19:13]

#

<?php
if (empty($_SESSION["sess_taso"])) {
  // 0, false, null, "" tai täysin olematon johtavat tänne.
}

Niksu [29.09.2009 15:12:12]

#

Ei auta edelleenkään, ihan sama onko noin vai joku edellä mainituista. Tuo koodi ei ole se ongelma. Vaan tämä jonka kylkeen olen tätä koittanut tehdä.

Ongelma on se, että tästä ei pääse läpi mikäli ei ole kirjautunut sisään.

<?php
//aloitetaan sessionit
session_start();

//asetukset
$tiedosto = "userit.txt"; //tiedosto jossa tiedot usereista
$tarkastus = "tarkista.php"; //TÄMÄ tiedosto
$etusivu = "userfilu.php"; //sivu jonne mennään kirjautumisen jälkeen

//jos tiedostoa ei ole, tehdään se
if(!file_exists($tiedosto)) {
  touch($tiedosto);
  chmod($tiedosto, "0766");
}

$data = file($tiedosto);
$userit = array();

//kerätään tiedot usereista
for ($i=0; $i<count($data); $i++) {
  $entry = explode("|", $data[$i]);
  $userit[$i] = $entry[0];
}

//tietojen siistimistä varten
function clean ($string) {
  $string = str_replace("|", "", $string);
  $string = strip_tags($string);
  $string = ereg_replace("\n", "", $string);
  return strtolower($string);
}

//jollei olla sisällä näytetään kirjautumislomake
if (empty($_SESSION["sess_tunnus"]) || $_SESSION["sess_iposoite"] != $_SERVER["REMOTE_ADDR"]) {
  $tunnus = clean($_POST["tunnus"]);
  $email = clean($_POST["email"]);
  $salasana = clean($_POST["salasana"]);
  $salasana2 = clean($_POST["salasana2"]);

// jos tähän laittaa ton Metalboxin pätkän, niin jää kiertämään kehää

  if (isset($_POST["kirjaudu"])) {
    if (in_array($tunnus, $userit) != "") {
      $entry = explode("|", $data[array_search($tunnus, $userit)]);
      if ($entry[2] == md5($salasana)) {
        //sessionit kuntoon
        session_register("sess_tunnus");
        $_SESSION["sess_tunnus"] = $tunnus;
        session_register("sess_iposoite");
        $_SESSION["sess_iposoite"] = $_SERVER["REMOTE_ADDR"];

        echo "<b>Kirjauduit sisään!</b><br>\n";
        echo "Jatka klikkaamalla <a href=\"". $etusivu ."\">tästä</a>.";
      }
      else {
        echo "<b>Virheellinen salasana.</b><br>\n";
        echo "Voit kirjautua uudelleen klikkaamalla <a href=\"". $tarkastus ."\">tästä</a>.";
      }
    }
    else {
      echo "<b>Tunnusta \"<i>". $tunnus ."</i>\" ei löydy.</b><br>\n";
      echo "Voit kirjautua uudelleen klikkaamalla <a href=\"". $tarkastus ."\">tästä</a>.";
    }
  }
  //rekisteröityminen
  elseif (isset($_POST["rekisteroidy"])) {
    if (in_array($tunnus, $userit) == $null) {
      if ($salasana == $salasana2) {
        if (strlen($tunnus) >= 3) {
          if (strlen($salasana) >= 3) {
            $fo = fopen($tiedosto, "a");
            flock($fo, 2); //lukitaan tiedosto
            fwrite($fo, $tunnus ."|". $email ."|". md5($salasana) ."|\n");
            flock($fo, 3); //ja vapautetaan se
            fclose($fo);

            echo "<b>Kiitos rekisteröitymisestäsi!</b><br>\n";
            echo "Voit nyt kirjautua sisään <a href=\"". $tarkastus ."\">tästä</a>.";
          }
          else {
            echo "<b>Epäkelpo salasana.</b><br>\n";
            echo "Voit rekisteröityä toisella salasanalla klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>.";
          }
        }
        else {
          echo "<b>Epäkelpo tunnus \"<i>". $tunnus ."</i>\".</b><br>\n";
          echo "Voit rekisteröityä toisella tunnuksella klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>.";
        }
      }
      else {
        echo "<b>Salasanat eivät täsmää.</b><br>\n";
        echo "Voit rekisteröityä uudelleen klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>.";
      }
    }
    else {
      echo "<b>Tunnus \"<i>". $tunnus ."</i>\" on jo käytössä.</b><br>\n";
      echo "Voit rekisteröityä toisella tunnuksella klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>.";
    }
  }
  else { // jos ei kirjaudu sisään niin se näyttää tän
    if ($_GET["act"] == "rekisteroidy") {
      echo "<form action=\"". $tarkastus ."\" method=\"post\">\n";
      echo "<b>Rekisteröidy</b><br>\n";
      echo "Jos sinulla on jo tunnus, <a href=\"". $tarkastus ."\">kirjaudu</a>.<br>\n";
      echo "Tunnus: <input type=\"text\" name=\"tunnus\"><br>\n";
      echo "E-mail: <input type=\"text\" name=\"email\"><br>\n";
      echo "Salasana: <input type=\"password\" name=\"salasana\"><br>\n";
      echo "Salasana uudelleen: <input type=\"password\" name=\"salasana2\"><br>\n";
      echo "<input type=\"submit\" value=\"Rekisteröidy\" name=\"rekisteroidy\">\n";
      echo "</form>";
    }
    else {
      echo "<form action=\"". $tarkastus ."\" method=\"post\">\n";
      echo "<b>Kirjaudu sisään</b><br>\n";
      echo "Ole hyvä ja kirjaudu sisään. Jos sinulla ei ole tunnusta, <a href=\"". $tarkastus ."?act=rekisteroidy\">rekisteröidy</a>.<br>\n";
      echo "Tunnus: <input type=\"text\" name=\"tunnus\"><br>\n";
      echo "Salasana: <input type=\"password\" name=\"salasana\"><br>\n";
      echo "<input type=\"submit\" value=\"Kirjaudu\" name=\"kirjaudu\">\n";
      echo "</form>";
    }
  }
  exit();
}
?>

Pitäis jotenkin päästä tosta sinne sivulle vaikka ei ois kirjautunu sisään.

Triskal [29.09.2009 15:50:38]

#

Niin siis mistä ei pääse läpi, tästäkö?

if (empty($_SESSION["sess_tunnus"]) || $_SESSION["sess_iposoite"] != $_SERVER["REMOTE_ADDR"]) {
    /***/
}

Eikös tuossa ole nimenomaan tarkoitus, että tartutaan kiinni, jos ei ole kirjautuneena?

Huomaa sekin seikka, että tuolla on exit();. Koodin suoritus loppuu siihen, elikkäs jos sulla on mitä tahansa tuon jälkeen suoritettavaa koodia, niin tuo katkaisee kaiken. Esimerkki:

<?php

// Tää tässä on includetettava_tiedosto.php

echo 'This is da shit.';

exit; // tai exit(); iha mite vaa
<?php

echo 'I gonna be a martyyyyyyr...';

include('includetettava_tiedosto.php'); // Suoritellaan includetetun tiedoston jutut

echo 'Tulostellaan lisää'; // Tätä ei ikinä tulosteta, koska includetetussa tiedostossa oli exit!

Siinä vaikuttais mun käsityskyvyn mukaan olevan ainakin yksi probleema.

Niksu [29.09.2009 16:32:40]

#

Juu, siihen se loppuu, mutta kysymys olikin mitenkä tuon pystyisi tekemään niin ettei se katkaisisi sitä.

Alunperin oli tarkoitus, että tartutaan jos ei ole kirjautuneena, mutta nyt pitäisi myös kirjautumatta päästä muutamalle sivulle. Mutta en voi ottaa koko härdelliä pois niistä sivuista, sillä niiden pitäisi hieman muuttua, kun kirjaudutaan sisään.

Tähän siis kaipaisin vinkkiä, että miten saisin tietyiltä sivuilta tuon kierrettyä, mutta silti tarkistettua, että ollaanko kirjautuneena. En oikein osaa selittää tätä tämän paremmin.

Triskal [29.09.2009 16:53:11]

#

Ota vaikka exit pois siitä. Ei se niin tarpeellinen loppujen lopuksi ole. Se on siinä nimenomaan sillä olettamuksella, että systeemi includetetaan johonkin ja se torppaa kaiken toiminnan jos ei ole kirjautunut.

Niksu [29.09.2009 16:58:00]

#

Eli jos otan exitin pois, niin sen jälkeen tuosta pääsee läpi kirjautumatta?

    else {
      echo "<form action=\"". $tarkastus ."\" method=\"post\">\n";
      echo "<b>Kirjaudu sisään</b><br>\n";
      echo "Ole hyvä ja kirjaudu sisään. Jos sinulla ei ole tunnusta, <a href=\"". $tarkastus ."?act=rekisteroidy\">rekisteröidy</a>.<br>\n";
      echo "Tunnus: <input type=\"text\" name=\"tunnus\"><br>\n";
      echo "Salasana: <input type=\"password\" name=\"salasana\"><br>\n";
      echo "<input type=\"submit\" value=\"Kirjaudu\" name=\"kirjaudu\">\n";
      echo "</form>";
    }
  }
}
?>

Mutta näyttää edelleen ton formin, eli siinä varmaan pitäis tehdä jotain tohon elseen joka ohjaa sen jatkamaan vaan sinne sivulle johon toi on includetettu.

alker [29.09.2009 19:18:56]

#

Eli minä käytän niin että otat sessioniin tunnuksen jolla se kirjautu ja laitat jos se on kirjautuneena näytetään: "Moi,Käyttäjä" ja jos ei niin näytetään kirjaudu formi

Niksu [29.09.2009 20:49:42]

#

Ööh, jospa annat olla kun et selvästikään ymmärrä mitä tässä haetaan...

Tässä kun tarttis ton kirjautumis formin sijaan päästä sille sivulle, johon toi on includetettu, vaikka ei olisikaan kirjautunut. Toki tuo formi tulee johonkin kohtaan sivua ja kirjauduttua siinä lukee esim. "Moi, Pena!".

Triskal [30.09.2009 10:37:07]

#

Tsori nyt Niksu, mutta vähän on nyt vaikea ymmärtää mitä yrität saada aikaiseksi. Se exit ei vaikuta ton formin näyttämiseen; eihän se _voi_ vaikuttaa siihen, kun se tulee sen lohkon _jälkeen_ missä formi on!

Tässä olisi vaikka vähän teoriaa siitä miten toteuttaa kirjautuminen.

<html>,<head>,<body>, jne...

<?php

// Tämä tässä on geneerinen sivu, page.php, joka on aina sama ja pohjana kaikille.
// Oletamme, että mikään sivu ei _vaadi_ kirjautumista, mutta että kaikille _voi_ kirjautua.
// Luonnollisesti "kirjautuneisuudesta" riippuen sivuilla näyteteään sitten eri juttuja

// Me haluamme, että kirjautuneisuuden tarkistus on eka asia mikä tehdään.

include('login.php') // Näin. Login.php on tietysti tuo putkavinkki.

// Ja nyt se login tietysti tulostelee kaikkea mitä me ei välttämättä haluta just _tähän_ kohtaan?
// Correct. Mitä tehdään? Pannaan tietysti skripti palasiksi ja sirotellaan ympäri sivua silleen kuin meille sopii.

echo '<div id="top">';
	// Tämän divin väliin tulee sivuston yläosaa vastaava silmäkarkkia ja ulkoasuhässäkkää
	// ja vaikka navi
	echo '
		<p class="navi">
			<a href="?p=tonne">Tonne</a>
			<a href="?p=tänne">Tänne</a>
		</p>
	';

	// Ja huvikseen tähän kohtaan nyt sitten vaikka se kirjautumisformi.
	// Tää seuraava pätkähän pitää sitten tietenkin ottaa pois login.php:sta.
	// Muistakkona, miten ton lohkon edessä luki else? No eipä lue enää.
	// Copypastetin siihen suoraan login-skriptin ekan if-lohkon ehdon.

	if (empty($_SESSION["sess_tunnus"]) || $_SESSION["sess_iposoite"] != $_SERVER["REMOTE_ADDR"]) {
      echo "<form action=\"". $tarkastus ."\" method=\"post\">\n";
      echo "<b>Kirjaudu sisään</b><br>\n";
      echo "Ole hyvä ja kirjaudu sisään. Jos sinulla ei ole tunnusta, <a href=\"". $tarkastus ."?act=rekisteroidy\">rekisteröidy</a>.<br>\n";
      echo "Tunnus: <input type=\"text\" name=\"tunnus\"><br>\n";
      echo "Salasana: <input type=\"password\" name=\"salasana\"><br>\n";
      echo "<input type=\"submit\" value=\"Kirjaudu\" name=\"kirjaudu\">\n";
      echo "</form>";
    }
	else {
		$tunnus = $_SESSION['tunnus']; // Just in case (vain salkussa)
		echo "<p>Moro $tunnus!</p>";
	}

echo '</div>';

echo '<div id="body">';
	// Tämä on pääasiassa tarkoitettu sisällölle

	$sivut = array("tonne", "tänne"); // meidän tarttee tietää etukäteen mitä sivuja on
	if(isset($_GET['p'])) $p = $_GET['p']; // Jos osoiteriviltä löytyypi ?p=*jotain*
	else $p = "tonne"; // "Tonne" on meidän default, sivu joka ladataan jos ei muusta ole tietoa
	$p = htmlspecialchars($p); // pitää varmistaa sen varalta, jos joku vaikka kirjoittaa javascriptia osoiteriville
	if(in_array($p, $sivut)) {
		include("pages/$p.php"); // ja ladataan sivu
	}
	else {
		echo "Ei tommosta oo";
	}

echo '<div>';

echo '<div id="bottom">';
	// Ja tänne tulee sitten alaosan jutskat
	echo '<p>Niksu &copy; teki tän. Lakrits autto. Vähä.</p>';
echo '<div>';

Tossa on aika paljon mitä voit suoraan hyödyntää. Toivottavasti tää auttaa.

Niksu [30.09.2009 14:13:11]

#

Sain tossa pikkutunneilla toimimaan jo. En oikeen osannu selittää mihin pyrin, mut kiitosta kuitenkin, kun yrititte ymmärtää. :D


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta