Avatar billede svinget Praktikant
21. maj 2015 - 11:50 Der er 17 kommentarer

Styre adgang til php sider med Login script

Jeg har et login script på min website, som fungere ganske udmærket. Jeg har dog brug for ekstra funktionalitet.

Når man er logget ind, har man adgang til alle sider. Jeg har brug for at man per bruger kan benytte hvilke sider man har adgang til. Det kan f.eks. være noget i stil med:
Bruger1: adgang til Page1
Bruger2: adgang til Page1 + Page2
Bruger3: adgang til Page1 + Page2 + page 3

Der vil altid være et hierarki, så hvis man f.eks. har adgang til Page3, så vil man også have adgang til page1 + page2 også.

Jeg benytter følgende script:
<?php
session_start();
ob_start();
$brugernavn = $_REQUEST["brugernavn"];
$adgangskode = $_REQUEST["adgangskode"];
$sql = "SELECT count(*) FROM brugere WHERE
brugernavn = '" . $brugernavn .
"' AND adgangskode = '" . $adgangskode ."';";
$resultat = mysql_query($sql);
$post = mysql_fetch_array($resultat);
if ($post[0] == 1) {
$_SESSION["brugernavn"] = $brugernavn;
header("Location: internal.php");
} else {
$fejl = urlencode("Forkert brugernavn og
adgangskode");
header("Location: index.php?besked=" . $fejl);
}
?>

Og har dette tjek på de beskyttede sider:
<?php
session_start();
if (!isset($_SESSION["brugernavn"])) {
header("Location: index.php");
}
?>

Kan det rettes til så jeg kan styre adgangen???

Mvh. Kim
Avatar billede tvilling53 Seniormester
22. maj 2015 - 12:16 #1
Hej
Indsæt en kolonne mere i din database, kald den f.eks. "status". Denne gives en værdi alt efter hvor mange sider der skal være adgang til, jo højere værdi jo flere sider er der adgang til.

På de beskyttede sider spørges der så til værdien fra "status"

IF($status>= 3) adgang ok

Thomas V
Avatar billede arne_v Ekspert
25. maj 2015 - 03:35 #2
Der er principielt to tilgange:

1) ring modellen

brugere har et adgangs niveau

sider har et mindste adgangs niveau

(det er hvad Thomas beskriver)

2) matrix modellen

logisk set har man man har en to dimensionel tabel med brugere/grupper/roller ud af den ene akse og sider/sidegrupper ud af den anden akse og for hver komnbination angives adgang
Avatar billede svinget Praktikant
14. juli 2015 - 08:34 #3
Hej - tak for svar. Fik ikke nogen mail fra sitet, så troede ikke nogen gad svare.

Jeg tester lige tvilling53 modellen af :)

Mvh. Kim
Avatar billede svinget Praktikant
14. juli 2015 - 09:20 #4
Jeg har adderet en kolonne med status, og prøvet at ligge det ind i nedenstående:
<?php
    session_start();
    if (!isset($_SESSION["brugernavn"])) {
    header("Location: index.php");
    }
    IF($status>= 3)
    ?>

Men der har ikke nogen effekt. Hvad mangler jeg
Avatar billede tvilling53 Seniormester
14. juli 2015 - 13:39 #5
Hej
du skal også trække værdien af status ud igen fra databasen og f.eks lægge værdien i en session.

På den side hvor logind skal fortages kan koden være sådan:

session_start();
ob_start();
$værdi = S_SESSION['værdi'];
IF($værdi>=3){den kode der skal udføres hvis logind er ok;}
else
  { header("Location: XXXXX.php");}
Thomas V
Avatar billede tvilling53 Seniormester
14. juli 2015 - 13:52 #6
Her er nogle rettelser:

i din sql skal der stå:
if ($post[0] == 1) {
$_SESSION["brugernavn"] = $brugernavn;
$_SESSION['status']=$post['status'];
header("Location: internal.php");

På den side hvor logind skal fortages kan koden være sådan:

session_start();
ob_start();
$status = S_SESSION['status'];
IF($status>=3){den kode der skal udføres hvis logind er ok;}
else
  { header("Location: XXXXX.php");}
Thomas V
Avatar billede svinget Praktikant
15. juli 2015 - 10:42 #7
Hej Thomas

Tak din hjælp. Jeg har prøvet at rette koden til, men får denne fejl:
Parse error: syntax error, unexpected '[' in /home/virtual/jungdo.dk/public_html/4dan_gigusul.php on line 32
Linie 29

Login siden:
https://drive.google.com/file/d/0B6zdqX7bqVi2cDBGdUYzMXRKNWM/view?usp=sharing

De alm. sider hvor der skal udføres tjek:
https://drive.google.com/file/d/0B6zdqX7bqVi2bkd2VGVkSXhZVEE/view?usp=sharing

Mvh. Kim
Avatar billede tvilling53 Seniormester
15. juli 2015 - 12:53 #8
Hej
hvad står der på linie 32 i din kode????
Thomas V
Avatar billede svinget Praktikant
15. juli 2015 - 14:33 #9
$status = S_SESSION['status'];
Avatar billede tvilling53 Seniormester
15. juli 2015 - 15:39 #10
Hej
Skrivefejl fra min side i linien:
$status = S_SESSION['status']; skal være $status = $_SESSION['status'];
Thomas V
Avatar billede svinget Praktikant
16. juli 2015 - 14:04 #11
Brokker sig stadig lidt :)
Parse error: syntax error, unexpected 'kode' (T_STRING) in /home/virtual/jungdo.dk/public_html/4dan_gigusul.php on line 33

Linie 33:
IF($status>=3){den kode der skal udføres hvis logind er ok;}
Avatar billede tvilling53 Seniormester
16. juli 2015 - 17:39 #12
Hej
Teksten "den kode der skal udføres hvis logind er ok" er skrevet for at fortælle dig at det er her den kode som skal udføres når log-in er ok skal stå.
Denne linie giver fejl:
IF($status>=3){den kode der skal udføres hvis logind er ok;}

men denne giver ikke fejl:
IF($status>=3){echo 'den kode der skal udføres hvis logind er ok';}

den sidste giver ikke nogen fejl på min PC..

Thomas V
Avatar billede svinget Praktikant
19. august 2015 - 08:44 #13
Så gik der lige ferie i den, men nu er jeg retur.

Tusing tak for din tålmodighed - Er ikke lige til dette php :)

Jeg kom af med fejl beskederne, men den er lidt for effektiv nu.

Hvis jeg har en bruger med status=3 giver " IF($status>=3)" ikke adgang.

Hvis jeg enten ændrer det til " IF($status>=2) eller "IF($status>=4)", så har jeg stadig ikke adgang

Hvis jeg ændrer til til " IF($status<=2), "IF($status<=3)" eller "IF($status<=4)" så har jeg adgang.

Spørgsmålet er om jeg får gemt $status uden værdi.

Er der en måde jeg kan se denne på efter log in?
Avatar billede tvilling53 Seniormester
19. august 2015 - 14:20 #14
Hej

Hver enkelt bruger skal så tildeles en værdi som skal stå i tabellen hvor du tjekker navn og kode #1

Som jeg ser det har du ikke nogen værdi i $status.

Du kan se den værdi som status har ved at skrive:
echo"<br> STATUS er = ".$status;
hvis du samtidig sætter // foran header("location:XXX.php"); for så bliver man på siden.( se svar #6)
Håber at det hjælper dig.

Thomas V
Avatar billede svinget Praktikant
20. august 2015 - 12:41 #15
Hej
Jeg må have en fejl i login scriptet, for jeg får "STATUS er = " efter login.

Jeg har data i "status" kolonnen i tabellen. Det er som om jeg ikke få fat i værdi'en når jeg logger ind.

Mvh. Kim
Avatar billede tvilling53 Seniormester
20. august 2015 - 17:23 #16
Hej
Jeg tror at vi skal starte med at finde ud af om du får dine data ud af tabellen som ligger i en database. Her er en kopi af min tilslutning til min tabel som er MYSQLI som efter min mening er nemmere at arbejde med og for tabellen er der ingen forskel.

<?php ob_start();//  Det script her er i MYSQLI

$server = "localhost";//Disse fire linier skal
$brugerident = "root";// tilrettes dine
$kode = "taunus12m";//  tilslutnings data
$db = "brugere";//

$mysqli = mysqli_connect($server, $brugerident, $kode, $db);
    /* Tjek, om der opstod en fejl */
if (!$mysqli){die("connektion failed:". mysqli_connect_error());}
  else
  {
    echo 'Forbindelsen er oprettet: <br/>'; 
  }
  /* change character set to utf8 */
$mysqli->set_charset("utf8");

//  I næste afsnit hentes oplysninger fra logindform.

$brugernavn=$_POST['brugernavn'];echo '<br>BRUGERNAVN er = '.$brugernavn;
$adgangskode=$_POST['adgangskode'];echo '<br>ADGANGSKODE er = '.$adgangskode;
//  $brugernavn ="xxxxxxxx";  $adgangskode="yyyyyy";
/* i test perioden kan xxxx og yyyy erstattes med de rigtige data og // fjernes i begyndelsen af linierne*/

if(trim($brugernavn)!="" && trim($adgangskode)!="")
    // Tester om der er data i begge variabler
  { if($stmt=$mysqli->prepare('SELECT id,navn,kode,status FROM brugere WHERE  navn=?'))
    { $stmt->bind_param('s',$navn);
      $stmt->execute();        $stmt>bind_result($bruger_id,$bruger_navn,$bruger_kode,$status);
      $stmt->fetch();
      $stmt->close();
      $id=$bruger_id;
                echo "<br>ID er = ". $id;
                echo "<br>BRUGERNAVN er = ".$bruger_navn;
                echo "<br> BRUGERKODE er = ".$bruger_kode;
                echo "<br> STATUS er = ".$status;
    }
  else
    {
    echo 'Der er i øjeblikket ikke adgang til databasen. Prøv igen senere.';
    die();
    } //inderste if-else afsluttes
  }
else
  {
      $fejl=1;
      echo '<br>Fejl i 48 er ='.$fejl;
      die();
  }//yderste if-else afsluttes
?>

Når du får dine data ud af tabellen kan du gå videre med at behandle de data du har fået ud.

Håber at du kan bruge det...
Thomas V
Avatar billede tvilling53 Seniormester
21. august 2015 - 15:18 #17
Hej
RETTELSE Hvis du er i tvivl skal det skrives sådan:

if(trim($brugernavn)!="" && trim($adgangskode)!="")
    // Tester om der er data i begge variabler
  { if($stmt=$mysqli->prepare('SELECT id,navn,kode,status FROM brugere WHERE  navn=?'))
    { $stmt->bind_param('s',$navn);
      $stmt->execute();
      $stmt->bind_result($bruger_id,$bruger_navn,$bruger_kode,$status);
      $stmt->fetch();
      $stmt->close();
      $id=$bruger_id;
                echo "<br>ID er = ". $id;
                echo "<br>BRUGERNAVN er = ".$bruger_navn;
                echo "<br> BRUGERKODE er = ".$bruger_kode;
                echo "<br> STATUS er = ".$status;

Thomas V
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester