getreidemuehlen
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 22.12.2005, 21:36   #1
TP-Supporter
 
Registriert seit: Dec 2005
[jacky] ist auf einem guten Weg

[PHP] Loginsystem - Therotische Frage


Hallo,

ich baue gerade ein relativ komplexes Loginsystem.
Da es sehr viele Administrator - "Werkzeuge" gibt, möchte ich gerne loggen, das ein User tut.
Wie sollte ich dabei vorgehen?
Soll ich eine Tabelle nehmen, die ca wie folgt aussieht:

Code:
fk_user_id   |  action
und dann dort die Userid mit der Aktion reinspeichern?
Oder soll ich nur die Adresse (also Url) speichern, darüber erfährt man ja eigentlich auch, was ein User macht.
Oder soll ich im Quellcode bestimmte "IDs" festlegen, so z.b. wenn ein Formular fehlerfrei losgeschickt wurde, dass dann dort z.b. folgendes steht:

$log_user_action_ID = 'user erfolgreich editiert'

und dann das speichern ... aber das wäre dann nciht sehr dynamisch, da ich auf jeder Seite, wo man sich einloggen kann bzw die man als eingeloggter besuchen kann eine solche ID vergeben müsste ...

Weitere Frage:

Soll ich dann immer einen neuen Datensatz speichern oder das als serialisiertes Array speichern: also immer auslesen, in Array umwandeln, dann eine Aktion hinzufügen und dann wieder serialisieren und speichern?

Danke im voraus!
[jacky] ist offline   Mit Zitat antworten


Alt 23.12.2005, 00:23   #2
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
das kann man nicht verallgemeinern, es kommt darauf an, was Du loggen willst.
Ich habe in der Regel bei allen Tabellen ein Feld uid, das anzeigt, wer den Datensatz geändert / gelöscht hat. Das ist sehr rudimentär.
Etwas kompletter ist eine Logtabelle, die die Aktion, Zeit und User festhält.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 23.12.2005, 00:43   #3
TP-Supporter
 
Registriert seit: Dec 2005
[jacky] ist auf einem guten Weg
Hm, es gibt in meinem Adminmenü folgende Menüpunkte:

- Benutzergruppen erstellen / editieren / löschen
- User anlegen / editieren / löschen
- Rechte anlegen / editieren / löschen
- Datenbankbackup erstellen

So, das will ich halt alles loggen.

So, wenn ich einen internen Bereich definieren will, mache ich das halt einfach über die Methode hasRight:

PHP-Code:
<?php
// hier halt so die config..
$cfg = array();
...

// instanz erstellen:
$um = new admin($cfg);

// und dann halt einfach schauen, ob der user einbestimmtes recht hat (kann ja im adminmenü erstellt werden):
if(!$um->hasRight('recht_name'))
   die(
'kein zugriff');

//... hier dann der rest des scripts...
?>
So, und so ungefähr sieht dasnn ein interner Bereich aus. Nun will ich halt loggen, wo er rumsurft etc.
Also sollte ich wahrscheinlich einfach sowas machen:

insert into logtabelle (time, userid, url) values ( time(), $_SESSION['userid'], $_SERVER['SCRIPT_NAME'] );

joa, wär das so nicht ganz gut?
[jacky] ist offline   Mit Zitat antworten
Alt 23.12.2005, 01:55   #4
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
naja, Du kannst loggen was Du willst, solang die Information auch wirklich nützlich ist. Es fallen halt auch viele Daten an, ich weiss ja auch nicht, wieviele User es gibt.
Das mit $_SERVER['SCRIPT_NAME'] kannst Du Dir sparen, wenn Du je nach Deinem Aufbau
in jeder Seite am Anfang in eine Session-Routine springst, die Dir Session öffnet, logt, etc.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 23.12.2005, 02:21   #5
TP-Supporter
 
Registriert seit: Dec 2005
[jacky] ist auf einem guten Weg
hm, ok ... eventuell ist das unwichtig zu loggen ...
wie wäre es nun mit den vordefinierten Aktionen im Adminmenü!?
Soll ich da einfach bestimmte site_ids vergeben (im Quellcode an entsprechender Seite in ein Superglobales array speichern) und dann am ende der Seite einach diesen Wert in die DB sichern?
[jacky] ist offline   Mit Zitat antworten
Alt 23.12.2005, 05:53   #6
giv
TP-Senior
 
Benutzerbild von giv
 
Registriert seit: Jan 2003
Ort: Darmstadt
giv macht sich hier sehr viel Mühe
ein log ist primär dazu da, ihn in bestimmten fällen auszuwerten. an deiner stelle würde ich mir überlegen, in welchen fällen du was evtl. wissen möchtest und wie du das dann visualisierst (z.B. html generierst oder einfach mit nem texteditor ne logdatei anschaust). dann sollte eigentlich ziemlich klar sein, welche der vielen möglichkeiten, die du dir überlegt hast, bezüglich der realisierung, man wählen sollte - nämlich die variante, mit der du am einfachsten deine auswertungen machen kannst.

normalerweise solltest du mit dem tripel (zeit, user, aktion) als eintrag auskommen. wenn du eine detailierte und flexible auswertung anstrebst, dann ist es sinnvoll, dies in einer datenbanktabelle noch weiter aufzuspannen, etwa (zeit, user, aktionstyp, message) - so könnte man etwa noch leicht erfolgreiche von nicht erfolgreichen aktionen filtern.
__________________
forenregeln - 3.d) ... richtige groß- und kleinschreibung benutzen ...
giv ist offline   Mit Zitat antworten
Alt 24.12.2005, 01:13   #7
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
Mir würde die Information das ein User eine bestimmte Aktion ausgelöst hat nicht reichen.
Wenn dann will ich ja auch wissen, was er gemacht hat.
Deshalb sind meine Logtabellen so aufgebaut:
ID | UserID | ID des geänderten Objektes| Aktion | alterWert | neuerWert | Timestamp der Aktion

Eine Routine prüft bei einer Änderungen welche Felder eines Datensatzes sich geändert haben und trägt nur die veränderten Werte ein. So hat man eine aussagekräftige Historie (Strasse des Kundendatensatzes mit der ID 521 von "Brummweg" auf "Bremer Strasse" geändert...).
Die Aktion wird per Funktionsaufruf übergeben und enthält "Neuanlage, Änderung, usw"
Die Information wo jemand rumgesurft ist halte ich für überflüssig, da sie die DB nur unnötig anschwellen lassen.
Wichtig ist doch die Aktionen festzuhalten, die eine Veränderung des bestehenden Datenbestands verursachen. Und genau hier will man später wissen: wer hat wann was geändert.
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 24.12.2005, 10:41   #8
TP-Supporter
 
Registriert seit: Dec 2005
[jacky] ist auf einem guten Weg
stimmt eigentlich
Naja, dann habe ich also so eine function (in etwa:
PHP-Code:
function log($pars)
{
  
$sql 'UPDATE logtable SET';
  foreach(
$pars as $k=>$v) {
    
$sql .= ' '.$k.' = "'.$v.",
  }
  // ^
  //  |
  // bzw auch insert into ...

und dann übergebe ich bei "news schreiben" z.b.:

PHP-Code:
if($_POST['sent'])
  
// ...
  // wenn kein fehler auftrat:
  
$this->log( array('userid' => $_SESSION['userid'], 
                          
'time' => time(),
                          
'aktion' => 'write_news',
                          
'newsid' => mysql_last_id(), 
                          
'ip' => $_SERVER['REMOTE_ADDR'], 
                          
'url' => $_SERVER['REQUEST'], // oder wie auch immer das nochma heißt^^
                         
));

bzw wenn jmd news ändert:

PHP-Code:
if($_POST['sent'])
  
// ...
  // wenn kein fehler auftrat:
  
$this->log( array('userid' => $_SESSION['userid'], 
                          
'time' => time(),
                          
'aktion' => 'edit_news',
                          
'newsid' => $_POST['change_id'], 
                          
'ip' => $_SERVER['REMOTE_ADDR'], 
                          
'url' => $_SERVER['REQUEST'], // oder wie auch immer das nochma heißt^^
                         
));

verstehe ich das so ungefähr richtig?

Geändert von [jacky] (24.12.2005 um 10:43 Uhr).
[jacky] ist offline   Mit Zitat antworten
Alt 24.12.2005, 11:01   #9
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
Ja genau so meinte ich das.
Da die Spalten in der Tabelle ja feststehen würde ich nicht bei jedem Aufruf ein Array bilden sondern eine eine feste Parameterliste an die Funktion übergeben.
Dann wäre der Aufruf auch kürzer.

Ich selbst arbeite mit Objekten und übergebe der Logfunktion das alte und das neue Objekt.
Dort vergleiche ich Eigenschaft für Eigenschaft und trage nur die veränderten Eigenschaften in die Logtabelle ein. So ists nochmal universaler.
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 24.12.2005, 11:33   #10
TP-Supporter
 
Registriert seit: Dec 2005
[jacky] ist auf einem guten Weg
stimmt, du hast recht.
Ich arbeite zwar auch mit Klassen (bzw eher mit einer Klasse, in der für jede Aktion (news löschen/editieren/anlegen) eine Funktion gibt ...
Hast du dann für jede Aktion eine Klasse oder wie?

Außerdem, wie vergleicht man das denn gescheit? Also ich meine, du hast doch nicht ale alten Werte in einer Klasse und alle neuen Werte in einer oder doch!?
[jacky] ist offline   Mit Zitat antworten
Alt 24.12.2005, 11:41   #11
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
Üblicherweise werden Änderungen ja über ein POST-Formular gemacht.
Vor einer Änderung habe ich den momentan Stand ja in der DB (Änderung) oder wenn es keinen entsprechenden Eintrag gibt, dann ist es eine Neuanlage.

Den alten Stand hole ich mir aus der DB und mit den POST-Eingaben bilde ich ein zweites Objekt.
Die Funktion rufe ich dann auf mit log($aktion,$altes_objekt,$neues_objekt);

In der Funktion kann man beliebige Objekte mittels get_object_vars analysieren und dann Wert für Wert vergleichen. Ich weiß aber nicht, ob das auch tatsächlich Sinn bei dir macht.
Bei mir ist jedes Datenbankobjekt eben ein Objekt und deshalb bietet sich das bei mir an.
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 24.12.2005, 14:13   #12
giv
TP-Senior
 
Benutzerbild von giv
 
Registriert seit: Jan 2003
Ort: Darmstadt
giv macht sich hier sehr viel Mühe
im allgemeinen tendiere ich dazu, logs in textdateien abzulegen. selten schreibt man für die ansicht von logs eine aufwändiges html interface oder ähnliches. am häufigsten schaue ich mir logs eh in rohform durch bzw. beachtet man gewisse kleinigkeiten bezüglich konsequent genutzter trennzeichen, dann bietet die unix konsole mächtige tools, um gezielt solche files auszuwerten.

oft werte ich logs auch nicht auf der produktionsmaschine aus, auf der der webserver läuft, muss sie daher in der regel erst noch verschieben/kopieren. mit ner db hab ich halt im allgemeinen erstmal mehr aufwand, an die daten ranzukommen. die häufigkeit, mit der man sich mit den logs beschäftigt muss, rechtfertigt den einsatz einer db oft nicht - es sei denn, das programm selbst nutzt die logs.
__________________
forenregeln - 3.d) ... richtige groß- und kleinschreibung benutzen ...
giv ist offline   Mit Zitat antworten
Alt 24.12.2005, 14:32   #13
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
Das kann man doch halten wie man will - ich benutze logs meist in der Admin-Umgebung, und da sind Tabellen leichter zu handhaben. Und ein Dump ist schnell gemacht (ja womit nur ? )

Daniels Lösung eignet sich zum Beispiel auch wunderbar dazu, solche Änderungen wieder rückgängig zu machen - gerade bei CMS-Systemen ist das ein sehr nützliches Feature.

Wenn man Logs in eine Klasse auslagert, kann man schnell und unkompliziert die Logs in DB / Dateien / Mail oder sonstwohin umleiten.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 24.12.2005, 14:53   #14
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
Ich benutze lieber DB-Tabellen, da man sich so über Filter auch schöne Historien ansehen kann.
Man kann sich die Ausgabe z.B. nach Aktionstyp oder User filtern lassen und bekommt so viel schneller einen Überblick als mit Textfiles.
Außerdem kann man durch einen einfachen Query alle veralteten Einträge aus der DB löschen. Da finde ich das Handling dann wieder viel einfacher als mit Textdateien.

Aber Du hast schon recht giv - man muss immer Aufwand und Nutzen gegeneinander abwägen. Da bei meinen Applikationen aber eh alles in Datenbankobjekten gekapselt ist und ich bereits universale Routinen und Schnittstellen habe, ist die Verwaltung eines Logs für mich mit wenigen Zeilen Code erledigt und in dem Fall weniger aufwändig als Textlogfiles.
Das mag bei anderen Anwendungen natürlich anders aussehen.
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
[PHP] Loginsystem - Therotische Frage [PHP] Loginsystem - Therotische Frage
« java - zufalls int | tut.php-q.net Aufgaben »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:45 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4