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/
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... :/
Laita hieman enemmän koodia näkyviin. Varmaankin pitäisi vain sisällyttää formin piirto jonkun ehdon sisään, jossa tarkistetaan onko kirjauduttu.
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.
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.
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ä.
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.
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.
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.
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.
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.
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
Öö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!".
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 © teki tän. Lakrits autto. Vähä.</p>'; echo '<div>';
Tossa on aika paljon mitä voit suoraan hyödyntää. Toivottavasti tää auttaa.
Sain tossa pikkutunneilla toimimaan jo. En oikeen osannu selittää mihin pyrin, mut kiitosta kuitenkin, kun yrititte ymmärtää. :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.