Intranet-Thread

Fragen zum Thema PHP können hier gestellt werden

Moderatoren: Basti, Andreas W.

Intranet-Thread

Beitragvon Sven am 26.06.2009, 08:30

Liebe Community,

gegenwärtig absolviere ich ein Praktikum in der ABC-Umformtechnik GmbH in der EDV-Abteilung. Ich habe den Auftrag, denen ein Intranet zusammenzuschustern.
Das Intranet soll folgende Funktionen haben:
- Loginsystem, gesicherte Bereiche
- Wissensdatenbank (ähnlich einer Wiki)
- Abteilungen als einzelne Module mit führenden Abteilungsleitern, die diese administrieren
- Abteilungs- und Mitarbeiterliste
- Newssystem mit Schlagzeilen aus dem Unternehmen
- Suchfunktion
- Adminpanel

Da ich zwar ein bisschen PHP kann, jedoch nicht so schrecklich viel, eröffne ich diesen Thread, falls ich mal Hilfe benötige.

Mein erstes Anliegen ist das Loginsystem:
Ich hatte es bereits zum Laufen gebracht. Allerdings kam dann "plötzlich" das Problem auf, dass ich nicht mehr in den internen Bereich weitergeleitet werde.

Das System setzt sich zusammen aus:
- mysql.php <- Verbindungsdaten zur Datenbank
- index.php <- Formular zum Einloggen
- login.php <- Die Einlogprozedur
- intern.php <- Interne Seite
- auth.php <- Prüft, ob die Session aktiv ist und leitet ansonsten auf die index.php weiter.
Logout.php gibt es noch nicht, kommt aber, sobald alles läuft.

Hier mal die Dateien:

mysql.php
Code: Alles auswählen
<?
$mysql_host = "localhost"; //Hostname
$mysql_user = "root"; //Datenbank-Benutzername
$mysql_pass = ""; //Datenbank-Passwort
$mysql_name = "abc_intranet" //Name der Datenbank
?>


index.php
Code: Alles auswählen
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Blubb</title>


</head>
<body>
<?php include("mysql.php"); ?>

<center>
<?
         if(isset($_REQUEST['fehler']))
         {
                 echo "Ein falscher Benutzername oder ein falsches Passwort ist eingegeben worden.<br />";
                 echo "Bitte versuchen Sie es erneut:<br />";
         }
         else
         {
                 echo "Sie haben nicht die erforderlichen Rechte, um diese Seite aufzurufen!<br /><br />";
                 echo "<b>Bitte loggen Sie sich ein.</b><br />";
         }
?>
                 <form name="frm_login" action="login.php" method="post">
                 <table width="200" height="100">
                         <tr><td> Benutzername: </td><td> <input type="text" name="fld_benutzer" size="15" /> </td></tr>
                         <tr><td> Passwort: </td><td> <input type="password" name="fld_passwort" size="15" /> </td></tr>
                         <tr><td> <input type="submit" name="btn_login" value="Login" /> </td>
                         <td> <input type="reset" name="btn_zuruecksetzen" value="Zur&uuml;cksetzen" /> </td></tr>
                 </table>
                 </form>

</center>
</body>
</html>


login.php
Code: Alles auswählen
<?
include("mysql.php");

// Datenbankverbindung
$mysql_db = mysql_connect($mysql_host, $mysql_user, $mysql_pass) or die ("<b>Fehler:</b> Die Verbindung zum Host ist nicht möglich!");
mysql_select_db($mysql_name, $mysql_db) or die ("<b>Fehler:</b> Die Datenbank existiert nicht!");

// Benutzerdaten aus Formular auslesen
$benutzername = $_REQUEST['fld_benutzer'];
$passwort = $_REQUEST['fld_passwort'];

// Datensätze auswählen
$mysql_ergebnis = mysql_query("SELECT * FROM accounts WHERE benutzername = '$benutzername' AND passwort = '$passwort'", $mysql_db);

if(mysql_num_rows($mysql_ergebnis) > 0)
{
         $mysql_daten = mysql_fetch_array($mysql_ergebnis);

         // Sessionvariablen erstellen
         $_SESSION["user_id"] = $mysql_daten["accountid"];
         $_SESSION["user_nickname"] = $mysql_daten["benutzername"];
         $_SESSION["user_vorname"] = $mysql_daten["vorname"];
         $_SESSION["user_nachname"] = $mysql_daten["nachname"];
         $_SESSION["user_abteilung"] = $mysql_daten["abteilung"];
         $_SESSION["user_funktion"] = $mysql_daten["funktion"];
         $_SESSION["user_telefonnr"] = $mysql_daten["telefonnr"];

         // Benutzer wird auf intern.php weitergeleitet, wenn er eingeloggt ist.
         header("Location: intern.php");
}
else
{
         header("location: index.php?fehler=1");
}

?>


intern.php
Code: Alles auswählen
<? include("auth.php"); ?>
<html>
<head>
<title>ABC Intranet - Interner Bereich</title>
</head>
<body>

<h1>Interner Bereich</h1>

Herzlich willkommen! <br /><br />
M&ouml;chten Sie sich wieder ausloggen? <a href="logout.php">Ja</a>
</body>
</html>


auth.php
Code: Alles auswählen
<?
session_start();
if(!isset($_SESSION["user_id"]))
{
         header ("location: index.php");
         exit;
}
?>


Danke schonmal für die Hilfe.

Gruß,
Sven


Edit: Die Datenbankstruktur wäre vielleicht noch hilfreich:

Name: abc_intranet
Tabelle: accounts
- accountid (int 10)
- vorname (varchar 50)
- nachname (varchar 50)
- abteilung (int 10)
- funktion (varchar 100)
- telefonnr (varchar 20)
- benutzername (varchar 20)
- passwort (varchar 50)
* Ein schlechter Handwerker schiebt die Schuld stets auf sein Werkzeug.
* Komm wir essen Opa! - Satzzeichen retten Leben.

Buxtehuder Fotofreunde Mein Nachbar Kurt
Schöne Geschichten aus der Fotografie, von Thomas Tremmel.
Benutzeravatar
Sven
Moderator
 
Beiträge: 1574
Registriert: 17.11.2008, 14:40
Wohnort: NRW / Ennepetal

Re: Intranet-Thread

Beitragvon BlueHuman am 26.06.2009, 10:34

kommt da vielleicht ne Fehlermeldung nach dem Login ?! ... oder warum wird nicht weitergeleitet ? Oder leitet er immer auf deine "Fehlerseite" um ?
BlueHuman
Mitglied
 
Beiträge: 4
Registriert: 26.06.2009, 10:30

Re: Intranet-Thread

Beitragvon Sven am 26.06.2009, 10:55

Da kommt garnichts. Man wird einfach wieder auf die Loginseite zurückgeleitet.

Ich vermute mal, der Fehler liegt in der auth.php. Habe schon versucht, verschiedene Session-Variablen zu prüfen, allerdings ohne Erfolg.
* Ein schlechter Handwerker schiebt die Schuld stets auf sein Werkzeug.
* Komm wir essen Opa! - Satzzeichen retten Leben.

Buxtehuder Fotofreunde Mein Nachbar Kurt
Schöne Geschichten aus der Fotografie, von Thomas Tremmel.
Benutzeravatar
Sven
Moderator
 
Beiträge: 1574
Registriert: 17.11.2008, 14:40
Wohnort: NRW / Ennepetal

Re: Intranet-Thread

Beitragvon Andreas W. am 26.06.2009, 11:37

Morgen!

Ich habe leider nicht viel Zeit, aber mir sind leider einige Dinge aufgefallen die fehlen, falsch oder einfach sehr fragwürdig sind.

Zuerst zu deinem Problem. Deine Sessions können nicht erzeugt werden, da du in deiner login.php, wo die Session-Variablen gesetzt werden sollen, keine Session gestartet wird. Daher werden auch keine Datensätze angelegt, wie du auch mit
Code: Alles auswählen
<pre><?php print_r($_SESSION); ?></pre>

sehen können solltest.

Was mir noch sehr aufgefallen ist sind deine Datenbankabfragen. Zum einen bekommst du deine Parameter aus dem $_REQUEST Array, das leider sehr unsauber ist. Ich empfehle dir, auf Formulardaten über das $_POST Array und auf URL-Parameter mit dem $_GET Array zuzugreifen. Des weiteren solltest du die Eingaben validieren. Momentan ist es kein Problem gefährlichen Code einzuschleusen. Ein anderes Problem ist die Art des Datenbankzugriffs. Ich würde an deiner Stelle auf MySqli anstatt auf die veralteten MySql-Funktionen zurückzugreifen.

Ein sehr großes Problem sehe ich auch darin, dass du tausende MySQL Objekte erzeugst. Ich empfehle dir eine common.php anzulegen, die in die index.php eingebunden wird. Diese common.php soll nun neben deinen KonfigurationsInformationen (MySQL-Logindaten, projektpfad, etc.) auch die erzeugung des MySQLi-Objects enthalten. Damit dies nun aber auch wirklich überall verfügbar ist, solltest du alle anderen Dateen nur über die index.php aufrufen. Das wird möglich in dem du mit URL-Parametern arbeitest. Sehr nützlich könnte e dabei sein mit folgendem Codeschnipsel zu arbeiten.

Code: Alles auswählen
ob_start();
include(test.php);
$content = ob_get_contents();
ob_end_clean();


Abschließend möchte ich dir noch ans Herz legen objektorientiert zu arbeiten, da du dir dadurch einiges an Arbeit sparen kannst. zudem würde ich dir empfehlen eine einfache templateEngine zu verwenden. Zu diesem thema findest du einiges hier im Forum.

Ich hoffe ich konnte dir etwas helfen.

MfG, Andy
Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
http://www.avedo.net
Benutzeravatar
Andreas W.
Web Moderator
 
Beiträge: 1229
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Intranet-Thread

Beitragvon Sven am 26.06.2009, 12:22

Hi,

danke für die Hinweise :) POST und GET habe ich jetzt überall eingefügt, klappt auch wunderbar. Genauso wie das Einloggen. Ich hatte wohl vorher unbewusst die Zeile für den Session-Start gelöscht :engel:
Mit URL-Parametern arbeite ich jetzt auch. Allerdings läuft alles über die intern.php und nicht die index.php. Hoffe, dass ist jetzt nicht schlimm.

Wegen MySQLi und OOP lese ich mich in den nächsten Tagen ein. Hab jetzt erst mal Feierabend :mrgreen:
* Ein schlechter Handwerker schiebt die Schuld stets auf sein Werkzeug.
* Komm wir essen Opa! - Satzzeichen retten Leben.

Buxtehuder Fotofreunde Mein Nachbar Kurt
Schöne Geschichten aus der Fotografie, von Thomas Tremmel.
Benutzeravatar
Sven
Moderator
 
Beiträge: 1574
Registriert: 17.11.2008, 14:40
Wohnort: NRW / Ennepetal

Re: Intranet-Thread

Beitragvon Sven am 01.07.2009, 09:42

Hm... Ich bin nun beim Rechtesystem angelangt:

Die Benutzer sind alle in vier Standardgruppen eingeteilt: Superadministrator, Administrator, Abteilungsleiter, Mitarbeiter.
Benutzer ohne Gruppen sollen keine Rechte haben, bis ihnen vom Admin eine Gruppe zugewiesen wird.

Ich habe jetzt drei MySQL-Tabellen: r_rechte, r_gruppenrechte und r_gruppen mit folgenden Datensätzen:

r_rechte
- rechtid
- rechtname

r_gruppen
- gruppenid
- gruppenname

r_gruppenrechte
- gruppenid
- rechtid
- hatrecht

Nun meine Frage: Muss ich jetzt für jede Gruppen-ID jedes Recht-ID unter "hatrecht" mit einer 0 bzw. 1 belegen? Oder gibt es da eine elegantere (sparsamere) Lösung?

Ich habe im Internet mal ein angeblich sehr flexibles Rechtesystem gefunden, bei dem jedes Recht eine Zweierpotenz seiner ID zugewiesen bekommt, also:
Startseite aufrufen - ID 0^2 = 0
Email schreiben - ID1^2 = 1
News verwalten - ID2^2 = 4
Adminpanel aufrufen - ID3^2 = 9

Durch Addition wird der jeweilige Rechtewert des Benutzers ermittelt. Zugang zu den Seiten soll erst ab einem bestimmten Rechtewert möglich sein:
Hat Benutzer "A" das Recht, Startseite und Email aufzurufen, bekommt er den Wert 0+1 = 1 zugewiesen. Da er unter 4 und 9 bleibt, ist ihm Zugang zur News und zum Adminpanel verwehrt.
Benutzer "B" kann die Emails schreiben, Startseite und Adminpanel aufrufen, aber keine News verwalten: 0+1+9 = 10.
Hier nun mein Problem: Rechtewert für News ist 4. Da "B" aber 10 hat, würde er trotzdem die News aufrufen können, obwohl er das nicht soll.
Oder habe ich einen Denkfehler?

Gruß,
Sven
* Ein schlechter Handwerker schiebt die Schuld stets auf sein Werkzeug.
* Komm wir essen Opa! - Satzzeichen retten Leben.

Buxtehuder Fotofreunde Mein Nachbar Kurt
Schöne Geschichten aus der Fotografie, von Thomas Tremmel.
Benutzeravatar
Sven
Moderator
 
Beiträge: 1574
Registriert: 17.11.2008, 14:40
Wohnort: NRW / Ennepetal

Re: Intranet-Thread

Beitragvon emtyx am 01.07.2009, 12:12

Also ich sehe da keinen Denkfehler.

Meiner Meinung nach hast du deine beiden Optionen schon aufgezählt :):
Wenn es wirklich unumgänglich ist, dass die Benutzergruppen nur bestimmte Aufgaben aufrufen dürfen, wirst du da nicht drum rum kommen, sie einzeln zuzuweisen.

Wenn hingegen die Gruppen einer gewissen Hierarchie folgen, also aufbauend wie hier im Forum (z.B. Mitglieder, Mods, Supermods, Admin) dann kann man das mit den Zahlen schon machen.
Du musst dir nur gut überlegen, ob du dazu wirklich die ID nehmen willst. Was passiert, wenn später noch eine Funktion hinzukommen soll, die schon "auf niedrigeren Ebenen" ausgeführt werden darf? Die hätte dann einen höheren quadrierten Wert, obwohl sie den nicht haben sollte. <--- Das ganze ist jetzt unter der Annahme, dass du mit ID den forlaufend numerierten Primärschlüssel meinst. Sry, falls ich das jetzt falsch verstanden habe.
Greetz =)
Benutzeravatar
emtyx
Mitglied
 
Beiträge: 619
Registriert: 08.04.2009, 17:58
Wohnort: Wien

Re: Intranet-Thread

Beitragvon Sven am 01.07.2009, 12:22

Hi,

du hast mich da schon richtig verstanden.
Das mit den Zahlen ist mir sowieso ein wenig suspekt, da ich mittlerweile 70 verschiedene Rechte habe, wodurch die Werte bis in die Unendlichkeit steigen.
Eine Hierarchie besteht nicht, da jeder praktisch andere Funktionen hat und der Admin auch in der Lage sein soll, benutzerdefinierte Gruppen hinzuzufügen.
Das System wurde auf der Seite aber als sehr flexibel beschrieben. Wenn ich den Link wiederfinde, poste ich ihn hier rein.

Ich werde es aber wahrscheinlich über meine bestehenden Tabellen lösen.

Gruß,
Sven
* Ein schlechter Handwerker schiebt die Schuld stets auf sein Werkzeug.
* Komm wir essen Opa! - Satzzeichen retten Leben.

Buxtehuder Fotofreunde Mein Nachbar Kurt
Schöne Geschichten aus der Fotografie, von Thomas Tremmel.
Benutzeravatar
Sven
Moderator
 
Beiträge: 1574
Registriert: 17.11.2008, 14:40
Wohnort: NRW / Ennepetal

Re: Intranet-Thread

Beitragvon emtyx am 01.07.2009, 13:17

Hmm.. also wenn du 70 Rechte oder mehr hast, dann kannst du das mit den Zahlen meiner Meinung nach sicher knicken.
Du kannst zwar versuchen, die Rechte irgendwie zusammenzufassen bzw. Abhängigkeiten herausfiltern, aber das wird hier auch nicht viel bringen. (Ich denke da z.B. an: "E-Mail versenden"-Recht hängt doch irgendwie mit "E-Mail Liste bearbeiten"-Recht zusammen). Aber ist wohl eher ein blöder Einfall.
Es gibt wahrscheinlich einfach zu viele Kombinationen (hab zwar die Statistik-Prüfung auf der Uni noch nicht gemacht, aber wenn mich nicht alles täuscht, sind es für 70 Möglichkeiten, die frei kombinierbar sind, ca. 1.19 x 10 hoch 100... also eine Zahl mit 100 Nullen :lol: ).

Was mir noch einfällt, wäre ein an IRC angelehntes Rechtesystem. Wenn dich das näher interessiert, werde ich mal einen Kumpel von mir fragen, der sich ziemlich gut im IRC auskennt.
Grundgedanke ist, dass jedem sogenannte Flags zugewiesen werden. Im IRC haben die die Form +aOpVft oder so in die Richtung. Hierbei steht z.B. das "a" für "Services Admin", das "O" für "Local IRC Operator" und so weiter... hab jetzt irgendwas genommen... also nichts konkretes. In deinem Fall wäre das "a" eben "E-Mail versenden" und so weiter...

Ich hab das System auch noch nicht ganz durchblickt, aber wenn es dich interessiert, dann frag ich mal nach.
So wie ich das verstehe, ist der Vorteil hierbei, dass jedem genau das Recht zugewiesen werden kann, welches er braucht. Es besteht zwar die Möglichkeit, das diese "Rechte-Zeichenketten" pro User sehr lang werden, aber das ist ja kein Problem, zumindest vom Speicheraufwand.
Die Kombinationen sind ja erweiterbar, weil ein großes A kann ja was anderes bedeuten als ein kleines a. Ich weiß, das ist noch lang kein Lösungansatz, aber u.U. mal ein Denkanstoß. Hoffe, ich habe mich soweit klar genug ausdrücken können :lol: .

Vielleicht gibts ja auch noch eine ganz andere, einfachere Lösung...
Greetz =)
Benutzeravatar
emtyx
Mitglied
 
Beiträge: 619
Registriert: 08.04.2009, 17:58
Wohnort: Wien

Re: Intranet-Thread

Beitragvon Skywalker am 02.07.2009, 14:58

Es gibt ja auch noch ein an ein binäres System angelehntes Rechtesystem, im Prinzip so ähnlich wie du schon überlegt hast.
Du erstellst einen String mit so vielen Nullen, wie du Rechte zu vergeben hast und weist jeder Ziffer an einer Stelle ein bestimmtes Recht zu. Falls das Recht erlaubt werden soll, einfach an der entsprechenden Stelle aus der 0 eine 1 machen.

Bsp.
1. Stelle: Startseite aufrufen
2. Stelle: Email schreiben
3. Stelle: News verwalten
4. Stelle: Adminpanel aufrufen

Ein User, der nun E-Mails schreiben, die Startseite und das Adminpanel aufrufen darf hat folgende Rechte:
1101

Diese Binärdarstellung kann man nun ins Dezimalsystem umwandeln und dann in der Datenbank speichern. (Falls du das nicht umwandelst, denkt die Datenbank, sie soll EintausendEinhunderdUndEins speichern, was nicht unbedingt vorteilhaft ist, wenn man möglichst viel Speicherplatz sparen will.
Allerdings hast du bei 70 binären Einsen folgende Dezimalzahl: 2^70 = 1.18059162E21
Falls die Zahlen zu groß werden sollten, kann man die "Binärfolge" der Rechte auch als String in der Datenbank speichern (was lediglich mehr Platz benötigt).

Der Vorteil des Systems liegt klar auf der Hand: Flexibilität. Benötigt man nach einem Jahr noch ein weiters Recht, so kann man das einfach als letzte Stelle der Folge hinzufügen. Ist bei einem aus der Datenbank eingelesenen Wert die letzte Stelle nicht vorhanden, so kann man als letzte Stelle einfach eine Null anhängen und in die Datenbank speichern.
There are only 10 types of people in the world, those who understand binary and those who dont.
phpblog
Benutzeravatar
Skywalker
Mitglied
 
Beiträge: 127
Registriert: 13.03.2008, 18:05

Re: Intranet-Thread

Beitragvon Andreas W. am 02.07.2009, 19:06

Shalom!

Ich muss sagen, dass ich dir stark von einem binären Rechtesystem abraten würde, da so bei knapp 31 rechten Schluss ist, da PHP einfach nicht mehr händeln kann. Lerne aus meinen Fehlern und ließ dir diesbezüglich mal diesen Thread durch.

MfG, Andy
Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
http://www.avedo.net
Benutzeravatar
Andreas W.
Web Moderator
 
Beiträge: 1229
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Intranet-Thread

Beitragvon Sven am 03.07.2009, 08:17

Hi und danke für eure Antworten :)

Das IRC-Rechtesystem würde mich mal sehr interessieren. Ob das aber auch bei 70+ Rechten funktioniert?
Geht auch mehr als ein Zeichen pro Recht? Weil ich bezweifle, dass alle Zeichen (groß- und klein) ausreichen. Wüsste jetzt auch direkt nicht, wie ich eine Abfrage programmieren soll, die nicht nur einzelne Zeichen, sondern agleichzeitig auch Zeichenfolgen auseinanderhalten kann... :?

Speichere ich die Rechte als String in der Datenbank (hab ich schon, unter "rechtname") , muss ich dem doch trotzdem einen Wert unter "hatrecht" zuordnen, oder?
Wäre glaub ich sinnvoller, als für jede Gruppe die kompletten Strings immer wieder neu zu schreiben.
Hoffe, ich habe dich da richtig verstanden, Skywalker.

Momentan bin ich immernoch beim alten System mit 0 und 1, was mir gerade am Leichtesten und Flexibelsten erscheint.


Zu einem weiteren Problem, welches sich mir gestern aufgetan hat:
Ich arbeite gerade an der Benutzergruppenverwaltung.
Zur Übersicht nochmal die aktuelle Datenbankstruktur:

r_rechte
- rechtid
- rechtname

r_gruppen
- gruppenid
- gruppenname

r_gruppenrechte
- gruppenid
- rechtid
- hatrecht

benutzer
- benutzerid
- vorname
- nachname
- benutzername
- passwort
- abteilung
- funktion
- telefonnr
- benutzergruppe

Ich möchte jetzt in einer Tabelle alle Gruppen mit den dazugehörigen Benutzern und Rechten ausgeben lassen.
Zwar habe ich mich schon an einer Abfrage versucht, jedoch bleibt die Tabelle immer leer:
Code: Alles auswählen
$mysql_abfrage = "SELECT * FROM `r_gruppen`,`r_rechte`,`r_gruppenrechte`,`benutzer`";

Code: Alles auswählen
$mysql_abfrage = "SELECT * FROM r_gruppen, r_rechte, r_gruppenrechte, benutzer";

Beide Abfragen erzielen das gleiche Ergebnis: Nämlich nichts. Meine Ausgabe sieht folgendermaßen aus:

Code: Alles auswählen
<? echo $mysql_ausgabe['benutzername']; ?>

oder
Code: Alles auswählen
<? echo $mysql_ausgabe['benutzer.benutzername']; ?>




Ein weiterer Versuch aus der Abteilungsübersicht, der auch tadellos funktioniert, lieferte mir in der Gruppenverwaltung (nachdem ich statt "*" alle Datensätze aufgelistet habe) auch nur leere Tabellen:
Code: Alles auswählen
$mysql_abfrage = "SELECT benutzer.benutzerid, benutzer.vorname, benutzer.nachname, benutzer.abteilung, benutzer.funktion, benutzer.telefonnr, abteilungen.abteilungsid, abteilungen.abteilungsname FROM benutzer, abteilungen WHERE benutzer.abteilung = abteilungen.abteilungsid";


Ausgabe:
Code: Alles auswählen
<? echo $mysql_ausgabe['abteilungsname']; ?>



Im Grunde genommen möchte ich wissen, wie ich es am besten angehe, dass ich aus mehreren Tabellen mehrere Datensätze ausgeben kann.

Gruß,
Sven
* Ein schlechter Handwerker schiebt die Schuld stets auf sein Werkzeug.
* Komm wir essen Opa! - Satzzeichen retten Leben.

Buxtehuder Fotofreunde Mein Nachbar Kurt
Schöne Geschichten aus der Fotografie, von Thomas Tremmel.
Benutzeravatar
Sven
Moderator
 
Beiträge: 1574
Registriert: 17.11.2008, 14:40
Wohnort: NRW / Ennepetal

Re: Intranet-Thread

Beitragvon emtyx am 03.07.2009, 14:52

Hoi, ich hab mal bisschen nachgefragt.

Für mich kam raus, dass man die Grundidee auf dein Problem durchaus anwenden kann, aber es 1:1 zu übernehmen wird nicht funktionieren.

Nur kurz, im IRC gibt es UserModes, ChannelModes und UserChannelModes.
  • UserModes sind globale Rechte für spezifische User.
  • ChannelModes sind lokal, um Einstellungen über den Channel machen zu können und
  • UserChannelModes beziehen sich auf einen lokalen Channel für einen globalen User.
Das hört sich für mich doch etwas kompliziert an, vorallem da diese UserModes angeblich eine Zahl sind... also eine Art User-Level. Das kam mir vom System her jetzt nicht so vor, also ob es auf dein Problem umgemünzt werden könnte. Also hab ich speziell nach diesen Flags gefragt. Dabei kam raus, dass es sogenannte "Server-Notice-Masks" gibt. Die identifizieren, an welchen IRC-Dienst der Command gesendet werden soll.

Ich hätte mir das folgendermaßen überlegt:
Jede Funktion(alität) des Systems bekommt einen Rechte-Buchstaben. Also sagen wir mal z.B. "E-Mail versenden" bekommt "e", "E-Mail-Liste bearbeiten" bekommt "l". Nun hättest du aber nur 2x26 Möglichkeiten zur Unterscheidung (nämlich einmal Klein- und einmal Großbuchstaben). Also wird das ganze auf eine Art "Rechte-Baum" erweitert. Ähnliche Funktionen bzw. Abteilungs-/Gruppenbezogene Funktionen bekommen sozusagen einen "Überbuchstaben". Den kennzeichnest du mit einem "minus". Die beiden oben genannten Funktionen wären daher "-e +e" und "-e +l". (Das wäre diese oben erwähnte Server-Notice-Mask. Sozusagen die Übergruppe, die festlegt, welcher "Art" diese Funktion zugehört). So ergeben sich meiner Rechnung nach schonmal 2*26 mal 2*26 = 52*52 = 2704 Möglichkeiten.

Nun kommt ein Benutzer und möchte die E-Mail-Liste bearbeiten, dem folgende Rechte zugewiesen sind: "-e +l -a +rf". Du weißt, von der Funktion, dass er dazu -e +l benötigt, also suchst du dir aus seinem Rechte-String das -e raus, und überprüfst es bis zum nächsten "minus". Du kannst dadurch eindeutig identifizieren, welche Rechte er in diesem Bereich hat, nämlich alle die nach -e mit einem + aufgelistet sind. (In dem Beispiel eben "E-Mail-Liste bearbeiten" und kA... sagen wir -a ist für das Abteilungspanel/whatever :)).

Vom Speicheraufwand dieser Rechte-Zeichenkette sollte es kein Problem sein, da es sich um einen gewöhnlichen String handelt. Diese kann als zusätzliches Feld an den Datensatz deiner Benutzergruppe oder wenn nötig der einzelnen Benutzer gehängt werden.
Auch von der Performance der Datenbank sollte das kein Problem darstellen, da es in Wirklichkeit zwei Queries sind. Einmal das auslesen der Benutzer-/Gruppen-spezifischen Rechte-Zeichenkette. Und das zweite Mal die geforderten Rechte der Funktion.
Das Vergleichen der Zeichenketten ist eine ganz normale String-Operation, da weiß ich gerade nicht, wie performant das sein wird, aber grundsätzlich sollte das keine Probleme machen.
Ich habe für bessere Lesbarkeit die Zeichenketten mit Leerzeichen gemacht, was aber für den Computer keinen Sinn ergeben würde, da du einfach von einem "minus" bis zum nächsten suchst ;).

Ich muss sagen, dass mir das mehr oder weniger in den letzten Stunden eingefallen ist, hab noch keine Erfahrung damit gemacht ;). Bin dir auch nicht böse, wenn du was komplett anderes vorziehst, weil man muss sich das sicher noch ein wenig genauer durchdenken. Da ich aber mit deinem Projekt nicht vertraut bin, kann ich dir das leider nicht abnehmen :) .
Falls sich jemand die Mühe gemacht hat, diesen Text durchzulesen, wäre es auch interessant, ob ihr Schwachstellen aufdecken könnt, würde mich persönlich auch interessieren, ob das soweit was taugen würde ;)

-------------------------------

Zu deinem SQL-Problem:
Hast du schon versucht, eins dieser Queries mal direkt im PHPmyadmin auszuführen? Vielleicht spukt er da eine Fehlermeldung aus, die dir helfen könnte...
Ich gehe mal davon aus, dass deine Datenbank-Verbindung soweit funktioniert, und kein Fehler im PHP Code ist.
Datenbank connecten, MySQL-String in mysql-query() einsetzen und dann das MySQL-Result auslesen --> mysql_fetch_assoc() in deinem Fall, da du ja per Feld-Name das Result ansprichst. Oder mysql_fetch_array($index, MYSQL_ASSOC)...

Zum Thema Tabellen verknüpfen lies dir mal das hier durch: MySQL JOIN und MySQL LEFT JOIN.
Greetz =)
Benutzeravatar
emtyx
Mitglied
 
Beiträge: 619
Registriert: 08.04.2009, 17:58
Wohnort: Wien

Re: Intranet-Thread

Beitragvon Guillermo am 03.07.2009, 18:57

Hallo, also ich ich habe das mit den Rechten so gelöst, dass ich eine Liste aller Rechte habe, welche du ja anscheinden auch schon hast. Jedes Recht hat also eine ID und einen Namen oder eine Beschreibung - was auch immer.
Und ich hab dann bei jedem User (bei dir Gruppen soweit ich das mitbekommen habe) einfach als String die Rechte reingeschrieben werden die Gruppe / der User besitzt.

Also z.b.
Rechtetabelle:

id name
0 email
1 news
2 adminpanel

So jetzt steht bei einer Gruppe bei der Spalte rechte z.b. einfach drin "0,1,2" oder "0,2". Ich meine Strings können ja lang sein und sind glaube ich zur Verarbeitung nicht wirklich rechenaufwendig, zumal du ja eh ein Intranetsystem schreibst.

Die Rechte kannst du dann ja einfach in ein Array speichern lassen, z.b.
Code: Alles auswählen
$string_rechte = "0,2,17,24"; // kann aus der datenbank geholt werden
$gruppen_rechte = explode(',' $string_rechte);

Hier mit hast du dein Array mit den Rechten,und kannst es mit Schleifen verarbeiten.

Falls diese Lösung nicht sehr gut sein sollte oder extrem rechenaufwendig oder was auch immer bitte ich um Entschuldigung, da ich in PHP auch nicht so viel Übung habe :) Aber vielleicht hilft es dir ja trotzdem was :lol:

Gruß Guillermo
Gebildet ist der, der weiß, wo er findet, was er nicht weiß.
Benutzeravatar
Guillermo
Mitglied
 
Beiträge: 710
Registriert: 01.10.2007, 18:18
Wohnort: Auerbach i.d.Opf

Re: Intranet-Thread

Beitragvon Sven am 04.07.2009, 10:14

Hm... Das mit dem "Überbuchstaben" verstehe ich noch nicht so ganz.
Ist es richtig, dass ein Minus (-) für abteilungs- und ein Plus (+) für gruppenbezogene Funktionen steht?
Wenn ich deine Beschreibung richtig verstanden habe, hat jetzt im Falle von "-e" eine komplette Abteilung das Recht, Emails zu lesen, unabhängig davon, in welchen Gruppen die Mitarbeiter dieser Abteilung sind?

Wenn es so ist, dann sehe ich keinen Bezug zum nachfolgenden Absatz. Hier verstehe ich das so:
"-e" ist die Rechtegruppe. z.B. "Email"
Dann kommen die Plus-Rechte (+) für die untergeordneten Rechte dieser Gruppe (also: lesen, schreiben, etc.).
Demnach hätte ich z.B. -e, +l, +s, +e, -a, +e
Das würde bedeuten, dass der Benutzer Lese-, Schreib- und Editierrechte im Bereich "Email" hat. Danach kommt das "-a" für z.B. Adminpanel, wo der Benutzer nur editieren kann.
Klingt für mich logischer als der vorherige Absatz - sofern ich alles richtig verstanden habe. Würde auch gut passen, da ich sowieso die Rechte in einer Exceltabelle nach Gruppen geordnet habe.
Allerdings fuchst mich die Sache mit der Groß- und Kleinschreibung ein bisschen: Der Server ist nämlich Windows, wo diese ja nicht beachtet wird. Soweit eigentlich kein Problem, da ich mit den bestehenden Rechtegruppen und ihren "Unterrechten" wahrscheinlich nicht alle Buchstaben im Alphabet füllen werde, jedoch leidet die Erweiterbarkeit erheblich darunter.
Naja, ich bin erst mal gespannt, ob ich überhaupt alles richtig verstanden habe :wink:

Danke auch für die Links zu Join. Das scheint ja genau das zu sein, was ich benötige, wenn ich mir die ersten Zeilen so durchlese. Werde es mir über das Wochenende zur Gemüte führen und vielleicht die ein oder anderen Abfrage posten.



@ Guillermo:
So ähnlich hatte ich das auch vor, jedoch ein bisschen komplizierter. Deine Variante ist, finde ich, um einiges einfacher als meine.
Wäre jetzt jedes Mal in die Datenbank gegangen, die für jede Gruppe alle Rechte erneut mit ID und Allem aufgelistet gehabt hätte, was bei den vier Standardgruppen, die ich vorhabe, schon 280 Datensätze gewesen wären.

Tja, jetzt schwanke ich zwischen deine Version und die von Emtyx. An Emtyx Version gefällt mir, dass man sich die Buchstaben einprägen und mit ein bisschen Übung bereits anhand der Zeichenfolgen erkennen kann, was die Gruppe für Rechte in welchen Bereichen hat. Geht mit Zahlen ja etwas schlecht.
* Ein schlechter Handwerker schiebt die Schuld stets auf sein Werkzeug.
* Komm wir essen Opa! - Satzzeichen retten Leben.

Buxtehuder Fotofreunde Mein Nachbar Kurt
Schöne Geschichten aus der Fotografie, von Thomas Tremmel.
Benutzeravatar
Sven
Moderator
 
Beiträge: 1574
Registriert: 17.11.2008, 14:40
Wohnort: NRW / Ennepetal

Nächste

Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast