Hallo Jörg,
session_start(); $_SESSION['user_name']=$benutzername; # woher der Benutzername auch immer kommt! foreach ($arGruppen as $strGruppe) { # Woher das Array mit den Gruppennamen # auch immer kommt! if ( user_in_group($benutzername, $strGruppe) ) # Die Funktion user_in_group musst Du # selbst schreiben! $_SESSION['groups'][$strGruppe]=true; } }
und dann einfach nur die Session abfragst um unötige und langsame Datenbankzugriffe zu vermeiden:
<?php session_start() # fehlt bei Dir! $host = $_SERVER["HTTP_HOST"]; $uri = rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\\"); if ( empty($_SESSION['user_name']) ) { //Falls: nicht eingeloggt header('Location: http://$host$uri/login'); exit; #deklaratorisch. Hier soll ja auch nichts passieren - oder? } else { //Fall: eingeloggt if (! empty($_SESSION['groups']['mitabeiter']) ) { #Fall: eingeloggt und Mitarbeiter: header('Location: http://$host$uri/index'); exit; #deklaratorisch. Hier soll ja auch nichts passieren - oder? } else { #Fall: eingeloggt und kein mitarbeiter: #whatever } } ?>
nein, der Session Start fehlt nicht, der liegt nur in einer anderen Datei, deshalb ich den nicht mit kopiert. Ich binde diesen so ein:
<?php
include_once 'inc/kopf.php';
?>
In dieser Datei steht dann dieses:
ob_start();
session_start();
require_once 'inc/zugangsdaten.php';
require_once 'include/config.php';
require_once 'include/functions/uebersicht.php';
require_once 'include/class/upload.class.php';
require_once 'include/lib/Swift-5.0.3/lib/swift_required.php';
error_reporting(E_ALL);
ini_set('display_errors', 1);
Was ich nicht verstehe, ich habe ja schon ein paar User Funktionen, diese sehe so aus:
function isUserLoggedIn($mysqli) {
$stmt = $mysqli->prepare("SELECT * FROM web_users WHERE user_session=?");
$stmt->bind_param("s", session_id());
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows() === 1) {
return true;
} else {
return false;
}
}
function login($mysqli, $userMail, $pw) {
$stmt = $mysqli->prepare("SELECT user_id FROM web_users WHERE user_nickname=? AND user_passwort=? AND user_aktiv=?");
$ak = 1;
$stmt->bind_param("sss", $userMail, $pw, $ak);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows() === 1) {
$stmt = $mysqli->prepare("Update web_users SET user_session=?, user_login=now() WHERE user_nickname=? AND user_passwort=?");
$stmt->bind_param("ssi", session_id(), $userMail, $pw);
$stmt->execute();
return true;
} else {
return false;
}
}
function userDaten($mysqli, $id) {
$stmt = $mysqli->prepare("SELECT user_type, user_nickname, user_login, ud_name, ud_vorname
FROM web_users
LEFT JOIN web_users_detail ON web_users_detail.ud_Uid = web_users.user_code
WHERE user_session=?");
$stmt->bind_param("s", session_id());
$stmt->execute();
$stmt->bind_result($user_type, $user_nickname, $user_login, $ud_name, $ud_vorname);
$stmt->fetch();
$userDaten = array(
'user_type' => $user_type,
'user_nickname' => $user_nickname,
'user_login' => $user_login,
'ud_name' => $ud_name,
'ud_vorname' => $ud_vorname
);
return (object)$userDaten;
}
Wenn ich jetzt alles auf Session umstellen würde dann müsste ich ja ALLE Scripe von mir wieder anpassen und dieses sind jetzt knapp 100 Dateien, die Zeit kann ich mir wirklich sparen?
Den Login und die Berechtigung prüfe ich ab jetzt so:
$host = $_SERVER["HTTP_HOST"];
$uri = rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\\");
if(isUserLoggedIn($mysqli) === FALSE) {
//Fall: nicht eingeloggt
header('Location: http://$host$uri/login');
} else {
//Fall: eingeloggt
$object = userDaten($mysqli, session_id());
if ($object->user_type == 'mitarbeiter') {
//Fall: ...als Mitarbeiter
header('Location: http://$host$uri/index');
}
}