[PHP/MySQL]Login mit Zugriffsbeschränkung Problem

kasimir

Member
Hallo,

ich hab ein Problem mit der Zugriffsbeschrenkung auf meiner Loginseite. Das Problem ist darin das wenn ein Benutzer in mehreren Gruppen (group_id) Mitglied ist er sich nicht mehr einloggen kann. Benutzer die nur in einer Gruppe sind hingegen schon.

In der Datenbank hab ich folgende zwei Tabellen:
siehe Anhang


index.php
PHP:
<?php require_once('../../../Connections/news.php'); ?>
<?php
session_start();

$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($accesscheck)) {
  $GLOBALS['PrevUrl'] = $accesscheck;
  session_register('PrevUrl');
}

if (isset($_POST['benutzername'])) {
  $loginUsername=$_POST['benutzername'];
  $password=md5($_POST['passwort']);
  $MM_fldUserAuthorization = "pmf_user_group.group_id";
  $MM_redirectLoginSuccess = "main.php";
  $MM_redirectLoginFailed = "index.php?f=1";
  $MM_redirecttoReferrer = true;
  mysql_select_db($database_news, $news);
  	
  $LoginRS__query=sprintf("SELECT pmf_user.name, pmf_user.pass, pmf_user.id, pmf_user_group.group_id FROM pmf_user, pmf_user_group WHERE pmf_user.name='%s' AND pmf_user.pass='%s' AND pmf_user.id=pmf_user_group.user_id"",
  get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password)); 
		
  $LoginRS = mysql_query($LoginRS__query, $news) or die(mysql_error());
  $loginFoundUser = mysql_num_rows($LoginRS);
  if ($loginFoundUser) {
    
    $loginStrGroup  = mysql_result($LoginRS,0,'pmf_user_group.group_id');

    $GLOBALS['MM_Username'] = $loginUsername;
    $GLOBALS['MM_UserGroup'] = $loginStrGroup;	      

    session_register("MM_Username");
    session_register("MM_UserGroup");

    if (isset($_SESSION['PrevUrl']) && true) {
      $MM_redirectLoginSuccess = $_SESSION['PrevUrl'];	
    }
    header("Location: " . $MM_redirectLoginSuccess );
  }
  else {
    header("Location: ". $MM_redirectLoginFailed );
  }
}
?>


main.php
PHP:
<?php
session_start();
$MM_authorizedUsers = "6";
$MM_donotCheckaccess = "false";

function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) { 
  $isValid = False; 

  if (!empty($UserName)) { 
    $arrUsers = Explode(",", $strUsers); 
    $arrGroups = Explode(",", $strGroups); 
    if (in_array($UserName, $arrUsers)) { 
      $isValid = true; 
    } 
    if (in_array($UserGroup, $arrGroups)) { 
      $isValid = true; 
    } 
    if (($strUsers == "") && false) { 
      $isValid = true; 
    } 
  } 
  return $isValid; 
}

$MM_restrictGoTo = "index.php?f=2";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {   
  $MM_qsChar = "?";
  $MM_referrer = $_SERVER['PHP_SELF'];
  if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
  if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0) 
  $MM_referrer .= "?" . $QUERY_STRING;
  $MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
  header("Location: ". $MM_restrictGoTo); 
  exit;
}
?>

Wo ist der fehler das sich der Benutzer der zu mehreren Gruppen gehört nicht einloggen kann? Hat jemand eine lösung oder kann mir sagen was ich ändern muss das es geht?

PS: Der Aufbau der Tabelle ist fest vorgegeben und kann nicht geändert werden.

Danke
kasimir
 

Attachments

  • tabellen.JPG
    tabellen.JPG
    11.6 KB · Views: 96
Last edited by a moderator:
Wo landet der User denn dann? (Auf $MM_redirectLoginSuccess oder auf $MM_restrictGoTo ?)

Dann scheint mir folgendes in isAuthorized() etwas überflüssig:
Code:
    if (($strUsers == "") && false) {
      $isValid = true;
    }

huschi.
 
Nachdem der Benutzer sich eingeloggt hat sollte er eigentlich auf der main.php ($MM_redirectLoginSuccess) landen, aber er lander auf der index.php ($MM_restrictGoTo).
Das komische ist ja, das wenn der Benutzer nur in einer Gruppe Mitglied ist das ganze geht.

kasimir.
 
Ich meinte natürlich "$MM_redirectLoginFailed oder $MM_restrictGoTo". Dummerweise ist beides die selbe "index.php".
Änder das mal, damit Du überhaupt weißt, wo Du zu suchen hast.
Ansonsten tippe ich darauf, daß evtl. der SQL-String fehlerhaft ist. Laß Dir $LoginRS__query doch mal ausgeben und kopier das direkt für die Datenbank rein.

huschi.
 
Hab jetzt $MM_redirectLoginFailed die index.php?f=1 und $MM_restrictGoTo die index.php?f=2 zugeordnet. Nach dem Login lande ich auf der index.php?f=2
also $MM_restrictGoTo.

Als $LoginRS__query bekomme ich das heraus:
SELECT pmf_user.name, pmf_user.pass, pmf_user.id, pmf_user_group.group_id FROM pmf_user, pmf_user_group WHERE pmf_user.name='test1' AND pmf_user.pass='6a75933403406f759f759fd759759' AND pmf_user.id=pmf_user_group.user_id

Das spuckt die Datenbank dann aus:
siehe Anhang


Kasimir
 

Attachments

  • datenbank.JPG
    datenbank.JPG
    7.9 KB · Views: 95
Änder mal bitte die Abfrage um:
PHP:
if ($loginFoundUser) {
Änder mal bitte die Abfrage um:
PHP:
 if ($loginFoundUser >= 1) {

Wenn Du die Information beider GroupIDs nicht brauchst, wäre ein SELECT DISTINCT auch noch eine Möglichkeit.
 
@marneus:
Leider hat mir das auch nicht weiter geholfen.


Was mir aber aufgefallen ist, ist folgende Zeile:
PHP:
$loginStrGroup  = mysql_result($LoginRS,0,'pmf_user_group.group_id');

Das bedeutet doch das nur der erste Datensatz vom Ergebnis weiter verarbeitet ist oder?
Falls dem so ist, hat der Benutzer ja keinen zugriff weil er nach der Abfrage ja nur in der Gruppe 4 ist und nur die Gruppe 6 zugriff auf die main.php hat. Seh ich das richtig?
 
Ach, ich dachte der gesamte Code wäre von Dir - sorry.

Ja in der Tat, hier wird nur die erste Zeile verarbeitet. Wenn Du die Informationen aller records brauchst und den Code nur wenig verändern möchtest wäre eine for-Schleife sinnig.

PHP:
for ($i=0;$i<=count($loginFoundUser)-1;$i++) {
  $groups .= mysql_result($LoginRS,$i,'pmf_user_group.group_id').',';  
}
$groups = substr($groups,-1);
Damit hast Du die GroupIDs alle in einem String, kannst sie mittels Explode auch in ein Array verwandeln oder $groups gleich zu einem Array machen.
 
@marneus:
Ich hab deinen Code ein bisschen geändert da ich sonst nur , raus bekomme.
PHP:
for ($i=0;$i <= $loginFoundUser-1;) {
$groups.= mysql_result($LoginRS,$i,'pmf_user_group.group_id').',';  
$i++;
}

Jetzt hab ich nur das Problem das auf der main.php ja
Code:
4,6,
ankommt. Nun müsst ich ja die Überprüfung nach der Gruppe auf der main.php so umschreiben das ja erst Gruppe 4, dann die Gruppe 6, usw. überprüft wird bis eine Zutreffende Gruppe gefunden wird, ansonsten wieder auf der Loginseite index.php landet? Nur wie müsst ich das dann machen?

kasimir
 
Last edited by a moderator:
Hast Du die Möglichkeit in unseren Chat zu kommen? Das wäre für uns beide am einfachsten.

Edit: Ich hab wohl vorhin geschlafen... Da fehlt auch eine 0.

PHP:
for ($i=0;$i<=count($loginFoundUser)-1;$i++) {
  $groups .= mysql_result($LoginRS,$i,'pmf_user_group.group_id').',';  
}
$groups = substr($groups,0,-1);

Edit 2: Inwiefern hast Du denn Hand angelegt an den Code? Der Code-Urheber hat ja anscheinend nicht mehr als einen Record als Antwort erwartet. Das umzuschreiben ist jedoch kein großes Problem.
 
Last edited by a moderator:
So, wird zwar ein Doppelpost, aber sonst wird das zu unübersichtlich.
index.php:
<font color="#000000"><font color="#007700">
PHP:
for ($i=0;$i<=count($loginFoundUser)-1;$i++) {
  $groups[$i] = mysql_result($LoginRS,$i,'pmf_user_group.group_id').',';  
}
main.php:
PHP:
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {  
  $isValid = False;  

  if (!empty($UserName)) {  
    $arrUsers = Explode(",", $strUsers);  
    $arrGroups = Explode(",", $strGroups);  
    if (in_array($UserName, $arrUsers)) {  
      $isValid = true;  
    }

    if (is_array($UserGroup)) {
      foreach ($UserGroup as $groupID) {
        if (in_array($groupID, $arrGroups)) {
          $isValid = true;
        }
      }
    } else {
      if (in_array($UserGroup, $arrGroups)) {  
        $isValid = true;  
      }
    }
    if (($strUsers == "") && false) {  
      $isValid = true;  
    }  
  }  
  return $isValid;  
} 

$MM_restrictGoTo = "index.php?f=2"; 
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {    
  $MM_qsChar = "?"; 
  $MM_referrer = $_SERVER['PHP_SELF']; 
  if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&"; 
  if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)  
  $MM_referrer .= "?" . $QUERY_STRING; 
  $MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer); 
  header("Location: ". $MM_restrictGoTo);  
  exit; 
} 
?>
 
Sorry das ich mich erst jetzt wieder melde.

Ich hab den Code den du mir gegeben hast eingefügt, aber zur zeit kann sich keiner mehr anmelden.
Der Aktuelle Standt sieht so aus:

index.php:
PHP:
<?php require_once('../../../Connections/news.php'); ?>
<?php
session_start();

$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($accesscheck)) {
  $GLOBALS['PrevUrl'] = $accesscheck;
  session_register('PrevUrl');
}

if (isset($_POST['benutzername'])) {
  $loginUsername=$_POST['benutzername'];
  $password=md5($_POST['passwort']);
  $MM_fldUserAuthorization = "pmf_user_group.group_id";
  $MM_redirectLoginSuccess = "main.php";
  $MM_redirectLoginFailed = "index.php?f=1";
  $MM_redirecttoReferrer = true;
  mysql_select_db($database_news, $news);
  	
  $LoginRS__query=sprintf("SELECT pmf_user.name, pmf_user.pass, pmf_user.id, pmf_user_group.group_id FROM pmf_user, pmf_user_group WHERE pmf_user.name='%s' AND pmf_user.pass='%s' AND pmf_user.id=pmf_user_group.user_id", // AND pmf_user_group.group_id=\"6\"
  get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password)); 
		
  $LoginRS = mysql_query($LoginRS__query, $news) or die(mysql_error());
  $loginFoundUser = mysql_num_rows($LoginRS);
  if ($loginFoundUser) {
		for ($i=0;$i<=count($loginFoundUser)-1;$i++) {
  		$groups[$i] = mysql_result($LoginRS,$i,'pmf_user_group.group_id').',';  
		} 

    $GLOBALS['MM_Username'] = $loginUsername;
    $GLOBALS['MM_UserGroup'] = $loginStrGroup;	      

    session_register("MM_Username");
    session_register("MM_UserGroup");

    if (isset($_SESSION['PrevUrl']) && true) {
      $MM_redirectLoginSuccess = $_SESSION['PrevUrl'];	
    }
    header("Location: " . $MM_redirectLoginSuccess );
  }
  else {
    header("Location: ". $MM_redirectLoginFailed );
  }
}
?>

main.php:
PHP:
<?php
session_start();
$MM_authorizedUsers = "6";
$MM_donotCheckaccess = "false";

function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {  
  $isValid = False;  

  if (!empty($UserName)) {  
    $arrUsers = Explode(",", $strUsers);  
    $arrGroups = Explode(",", $strGroups);  
    if (in_array($UserName, $arrUsers)) {  
      $isValid = true;  
    }

    if (is_array($UserGroup)) {
      foreach ($UserGroup as $groupID) {
        if (in_array($groupID, $arrGroups)) {
          $isValid = true;
        }
      }
    } else {
      if (in_array($UserGroup, $arrGroups)) {  
        $isValid = true;  
      }
    }
    if (($strUsers == "") && false) {  
      $isValid = true;  
    }  
  }  
  return $isValid;  
} 

$MM_restrictGoTo = "index.php?f=2"; 
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {    
  $MM_qsChar = "?"; 
  $MM_referrer = $_SERVER['PHP_SELF']; 
  if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&"; 
  if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)  
  $MM_referrer .= "?" . $QUERY_STRING; 
  $MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer); 
  header("Location: ". $MM_restrictGoTo);  
  exit; 
} 
?>

PS: Der Grundcode von dem ich das ganze hab und abändern will sieht so aus:
index.php (als txt Datei)
main.php (als txt Datei)

kasimir
 
PHP:
		for ($i=0;$i<=count($loginFoundUser)-1;$i++) {
  		$groups[$i] = mysql_result($LoginRS,$i,'pmf_user_group.group_id').',';  
		} 

    $GLOBALS['MM_Username'] = $loginUsername;
    $GLOBALS['MM_UserGroup'] = $loginStrGroup;
Das Array $groups wird gar nicht mehr genutzt und statt dessen die leere $loginStrGroup gesetzt. Hier könnte es so heißen:
PHP:
    $GLOBALS['MM_UserGroup'] = implode(',', $groups);
Und bei der Gelegenheit ist die Konkatenation mit ',' überflüssig.

Für weiteres Debuggen, laß Dir doch mal alle Parameter von isAuthorized() ausgeben.

huschi.
 
Die Parameter von isAuthorized() für den Benuzter test1:
$strUsers:
$strGroups: 6
$UserName: test1
$UserGroup: 4,

Benutzer test:
$strUsers:
$strGroups: 6
$UserName: test
$UserGroup: 6,

Ich hoff mal du hast das so gemeint :rolleyes:

Wenn ich die Konkatenation mit ',' weglasse kann sich der Benutzer test wieder einloggen. Beim Benutzer test1 ist dann $UserGroup: 4 (also ohne , )

kasimir
 
Ja, das war schon mal gut.

Fang mal vorne an:
test1 sollte $UserGroup='4,6' enthalten. (Das letzte Kammer ist unwichtig, wenn nicht sogar störend.)
Laß Dir mal an der Stelle mit $GLOBALS['MM_UserGroup'] den entsprechenden Wert ausgeben.

huschi.
 
Ich hab mal die for-Schleife ein bisschen abgeändert und zwar so:
PHP:
for ($i=0;$i<=count($loginFoundUser)-1;$i++) { 
$groups[$i] = mysql_result($LoginRS,$i,'pmf_user_group.group_id').',';   
}
in
PHP:
for ($i=0; $i<=$loginFoundUser-1; $i++) {
$groups[$i] = mysql_result($LoginRS,$i,'pmf_user_group.group_id'); 
}

Durch die abgeänderte for-Schleife ist jetzt der Wert in $_SESSION['MM_UserGroup'] für den Benutzer test1 = 4,6
Der Wert müsste jetzt ja dann richtig sein oder?
 
Bei Schleifen in ein Array ist das "," sowieso vollkommen fehl am Platze! Hab ich vergessen zu entfernen.
 
Eigentlich meinte ich nicht das Komma, sondern
$i<=count($loginFoundUser)-1;
zu
$i<=$loginFoundUser-1;
da ja $loginFoundUser schon die anzahl ist.
 
Jetzt wo Du es erwähnst...
...ja auch das war ein Fehler.

PS: Ein Grund warum man ungarische Notation nutzen sollte: Man weiß was Variablen wirklich darstellen und der Fehler wäre direkt aufgefallen.

Wenn man das plus/minus-Eins Problem noch raus nimmt kommt man auf:
PHP:
for ($i=0; $i < $loginFoundUser; $i++) {
Wenn Dein Wert für MM_UserGroup nun stimmt, läuft es denn jetzt auch?
Bzw. was kommt nun in isAuthorized() an?

huschi.
 
Benutzer test (eine Gruppe, Login geht):
MM_UserGroup = 6

isAuthorized():
$strUsers =
$strGroups = 6
$UserName = test
$UserGroup = 6

Benutzer test1 (zwei Gruppen, Login geht nicht):
MM_UserGroup = 4,6

isAuthorized():
$strUsers =
$strGroups = 6
$UserName = test1
$UserGroup = 4,6

Also muss ja noch irgentwo ein fehler in der main.php sein. Nur wo? :confused:
 
Back
Top