1) Login-Modul: aus Download-Bereich, Module, Suche nach 'Login' bzw. in Kategorie 'Sonstiges / Misc' --> Modul 'Login (Login / Logout / Passwort vergessen)'
2) Authentifizierung: aus Download-Bereich, Templates, Community / Login, Auth.. --> Template: 'Authentifizierung - mehrere Benutzerbereiche'
3) Simple-User-AddOn: aus Download-Bereich, AddOns --> AddOn: 'Simple User'
Während das simple_user-AddOn 1:1 in REX 4.0 installiert werden kann, habe ich das Authentifizierungstemplate und das Login-Modul angepasst. Zusätzlich machte ich eine Anpassung in der (Redaxo-Installations-)Klasse class.rex_login.inc.php (vermutlich ist da noch ein Fehler drin). Der gesamte Installationsvorgang ist zu Beginn des Login-Moduls im Quelltext dokumentiert. Dort sind auch die Open Issues vermerkt.
Gruss,
rudoo
Login-Modul (in Modulausgabe kpieren, Moduleingabe bleibt leer)
Code: Alles auswählen
<?php
if ($REX['GG']) { // nur im Frontend ...
/* LOGIN mit Anmelden / Abmelden / Passwort-Vergessen, Portierung für REX 4.0
*
* Autor: Rudi Widmer (rudoo), Christoph Böcker (chris-b)
* Version: 2.0
* Datum: 12.01.2008
*
* Quelle (Anmelden/Abmelden): Login-Prozedur der Redaxo-Demo
*
* Modifikationen:
* Anpassung von REX 3.2 auf REX 4.0
* keine Zweisprachigkeit
*
* Voraussetzungen
* Dieses Modul ist abgestimmt und gedacht für den Einsatz mit folgenden
* Redaxo-Komponenten:
* Auth.-Template: 'Authentifizierung - mehrere Benutzerbereiche', Version für REX 4.0
* Addon: 'simple user 0.9' (http://www.redaxo.de/180-Addondetails.html?addon_id=2),
* Version für REX 3.0, REX 3.1
*
* Open Issues (Stand 9.1.2008, rudoo)
* 1) Die Backend-'User Verwaltung' zeigt bei der Auswahl eines Users bzw. einer
* Gruppe Fehlermeldungen an (die Funktion ist allerdings gewährleistet)
* 2) Die Fehleranzeige in der Klasse class.rex_login.inc.php über die Globalvariable
* $I18N funktioniert noch nicht ($I18N wird nicht gefunden)
* 3) Optionale Anpassungen für mehrere Benutzerbereiche (Navigationstemplate) noch
* nicht portiert auf REX 4.0
* 4) Der in der Installation erwähnte 'Zehnte Schritt' ist vermutlich temporärer Natur
*
* Installation:
* Erster Schritt:
* simple_user AddOn installieren:
*
* Shell-Befehle:
# cd <Redaxo-Pfad>/redaxo/include/addons
# mkdir simple_user (ACHTUNG: Der Dir-Name fix, sonst klappt Installation nicht!)
# cd simpleuser
* Download von www.redaxo.de->Downloads->AddOns->Simple User->simple_user0_9.zip
* nach <Redaxo-Pfad>/redaxo/include/addons/simple_user
# unzip simple_user0_9.zip
# cd ..
# chown -R <Internet-User> simple_user (Mod. der Owner-Rechte auf Verz. 'simple_user')
# chgrp -R <Internet-Group> simple_user (Mod. der Gruppenrechte auf Verz. 'simple_user')
*
* simple_user AddOn-Installationsroutine aufrufen:
* Im Backend unter 'AddOns' -> 'simple_user' -> 'installieren' (es sollte keine Fehlermeldung auftreten)
* (--> In der DB 'redaxo' werden neue drei neue Tabellen 'rex_2_...' angelegt)
*
* simple_user AddOn aktivieren:
* Im Backend unter 'AddOns' -> 'simple_user' -> 'aktivieren' (keine Fehlermeldung erhalten)
* --> Es sollte ein neuer Menüpunkt 'User Verwaltung' erscheinen. Wenn stattdessen ein
* Menüpunkt mit kryptischem Text erscheint, ist die unter 'System' eingestellte Sprache vom
* AddOn nicht unterstützt. (Unterstützte Sprachen siehe Ordner .../addons/simple_user/lang,
* Typischerweise sollte unter 'System' die Sprache 'de_de' eingestellt sein)
*
* Zweiter Schritt - optional - nur nötig für mehrere Benutzerbereiche (noch nicht getestet):
* Im Backend unter 'User Verwaltung'->'Gruppe' muss für jeden potentiellen Benutzerbereich eine
* neue Gruppe erfasst werden. Die hier für die Gruppe generierte id wird dem
* jeweiligen User später in der Userverwaltung zugeordnet (siehe 'Dritter Schritt')
*
* Dritter Schritt:
* Im Backend unter 'User Verwaltung' den Benutzer anlegen mit folgenden (zwingenden) Eigenschaften:
* - Feld 'Benutzertyp': id aus 'zweitem Schritt' bzw. falls keine Benutzerbereiche:
* INT-Wert > 0 (Wert 0 würde zu Login-Problemen führen)
* - 'User Status': online
* - 'Login aktiviert': ja
* - 'Email' unter 'Persönliche Daten': <Email-Adresse für Zusendung Passwort bei 'Passwort vergessen'>
* - 'Login': <Loginname>
* - 'Passwort': <Login-Passwort>
*
* Vierter Schritt:
* Im Backend unter 'Templates' das Authentifizierungs-Template installieren:
* 'Authentifizierung - mehrere Benutzerbereiche', Version für REX 4.0'
* Die Nummer, unter der das Template angelegt wurde, bitte merken (siehe 'Fünfter Schritt'):
*
* Fünfter Schritt:
* In das Seitenlayout-Template (z.B. 'default') das Authentifizierungs-Template einbinden.
* z. B. so:
*
* Code:
* ...
// Authentifizierungstemplate von Raybeam includen fuer Login - 9.2.2008
$navTemplateAuth = new rex_template("6");
include $navTemplateAuth->getFile();
* ...
*
* Die Nummer "6" muss der Nummer des eigenen Authentifizierungs-
* Templates angepasst werden (siehe 'Vierter Schritt')
*
* Sechster Schritt - optional - nur nötig für mehrere Benutzerbereiche (noch nicht portiert auf REX 4.0):
* Das Navigationsmenü von raybeam benutzen, nach Anpassung auf REX 4.0., dies ermöglicht
* die Anzeige von benutzerbereichsspezifischen Navigationen
*
* Siebter Schritt:
* Im Backend unter 'Module' dieses Modul (diesen Code) installieren
* Am Anfang des Programmcodes stehen ein paar Variablen, die sie setzen sollten.
* Speziell: $webmaster und $absender.
*
* Achter Schritt:
* Die Login-Seite anlegen.
* Legen Sie im Backend unter 'Struktur' einen neuen Artikel an, der das im 'Siebten Schritt'
* angelegte Login-Modul enthält. Die Artikel-ID (z.B. 999) merken wir uns für den nächsten Schritt.
*
* Neunter Schritt:
* Einen Menüpunkt "Login" bzw. "Logout" in der Navigationsliste erzeugen.
* Es sollte so aussehen, dass je nach Anmeldestatus entweder dar Text "Login"
* oder der Text "Logout" erscheint. Um einen solchen Text zu erzeugen, wird ein Navigations-
* Template mit Navigationsliste in der Variable $navHeader z.B. so angepasst:
*
* Code:
* ...
if (!$_SESSION['USR'] OR $_GET['LOGOUT'] == 1) {
$navHeader .= '<li><a href="'.rex_getUrl(999,$REX['CUR_CLANG']).'">Login</a></li>';
}
else {
$navHeader .= '<li><a href="'.rex_getUrl($REX['START_ARTICLE_ID'],$REX['CUR_CLANG'],'&FORM[LOGOUT]=1').'">Logout</a></li>';
}
* ...
*
* Wie zu sehen ist wird beim Klick auf 'Login' der Artikel 999 aufgerufen (Login-Seite) bzw.
* beim Klick auf 'Logout' die Startseite. Die Nummer 999 ist durch die Nummer des
* Login-Artikels (siehe 'Achter Schritt') zu ersetzen. Falls nach dem Logout
* eine andere Artikelseite gewünscht wird als die Startseite (z.B. erneutes
* Login) müßte auch $REX['START_ARTICLE_ID'] ausgetauscht werden.
*
* Zehnter Schritt - Verifizieren der Redaxo-Klasse .../redaxo/include/classes/class.rex_login.inc.php:
* Stand 9.1.2008: Die Klasse enthält in den Funktionen setUserquery und setLoginquery falsche Zuweisungen,
* die gemäss untenstehendem Code zu korrigieren sind:
*
* Code (gefixt):
* ...
// Aenderung 9.1.2008: $user_query statt $login_query
function setUserquery($user_query)
{
$this->user_query = $user_query;
}
*
* ...
* ...
*
function setLoginquery($login_query)
{
// Aenderung 9.1.2008: $login_query statt $user_query
$this->login_query = $login_query;
}
* ...
*
*
* Fertig - Mit diesen Aenderungen sollte der Login unter REX 4.0 funktionieren
* Viel Spass - rudoo, 12.1.2008
*/
/*------------------------------------------------------------------------------
* $webmaster an ihn geht die eMail mit dem Antrag nach einer
* Login-Berechtigung (Name, Kennwort)
* default: Webmaster (meist bei ERROR_MAIL eingetragen) :-))
* $absender Mit dieser Absenderadresse verschickt das System die Mails
* wenn das Passwort vergessen worden war.
* default: webmaster
* $nach_login Diese Seite wird angesprungen wenn das login erfolgreich war
* Default = Startseite
* $nach_logout Diese Seite wird angesprungen wenn das logout erfolgreich war
* Default = Startseite
*/
$webmaster = 'mailto:'.$REX['ERROR_EMAIL'];
$absender = $webmaster;
$nach_login = $REX['START_ARTICLE_ID'];
$nach_logout = $nach_login;
// URL und andere interne variablen setzen: ------------------------------------
$ich = $this->getValue("article_id");
$url_ich = rex_getUrl($ich,$REX['CUR_CLANG']);
$url_nach_login = rex_getUrl($nach_login,$REX['CUR_CLANG']);
$url_nach_logout = rex_getUrl($nach_logout,$REX['CUR_CLANG']);
$msg = "";
if($_SESSION['USER']->message != "") {
$msg = '<p class="warning">'.$_SESSION['USER']->message."</p>";
}
// Was ist denn nun zu tun? ----------------------------------------------------
if ($_GET['FORM']['pwd'] == 1) {
//Formular für "Passwort vergessen" anzeigen
$func = 1;
}
elseif ($_POST['FORM']['pwdsnd'] == 1) {
// Wenn Feld email gefüllt dann Kennwort senden (2),
// sonst Formular für "PWD vergessen" (1)
$email = $_POST['email'];
$func = (empty($email)?1:2);
}
elseif (!$_SESSION['USR'] OR $_GET['FORM']['LOGOUT'] == 1) {
// Login: Name und Kennwort eingeben
$func = 5;
}
else {
$func = 6;
}
/* Passwortmail anfordern: -----------------------------------------------------
* Aufbau der Maske zum Eingeben der eMail-Adresse, an die Name/Kennwort
* geschickt werden sollen.
*/
if ($func == 1) {
print '
<p>Sie haben Ihr Kennwort vergessen? Kein Problem!</p>
<p>Geben Sie im Eingabefeld Ihre hinterlegte Mailadresse an. Sie erhalten
dann an diese Mailadresse Ihre aktuellen Zugangsdaten zugeschickt.
Bitte achten Sie darauf, die richtige Mailadresse richtig einzugeben.</p>
<form action="'. $url_ich .'" method="post">
<input type="hidden" name="article_id" value="'.$ich.'" />
<input type="hidden" name="FORM[pwdsnd]" value="1" />
<input type="hidden" name="clang" value="'.$REX['CUR_CLANG'].'" />
<label for="email">Mail-Adresse</label>
<input id="email" type="text" name="email" size="50" /><br />
<input class="submit" type="submit" value="Kennwort anfordern" />
</form>
';
}
/* Passwortmail senden: --------------------------------------------------------
* $email wurde schon oben gesetzt.
* Aus rex_2_user wird der Datensatz mit dieser mailadresse gesucht. Im Fehlerfall
* geht gibt es eine Meldung und mit "Weiter" kommt man wieder auf die Eingabe.
* Wenn eindeutig(!) gefunden geht eine Mail an diese Adresse.
*/
elseif ($func == 2) {
$sql = new sql;
$sql->setQuery ('SELECT user_login, user_password, user_name, user_firstname FROM '.
$REX['TABLE_PREFIX'].'2_user where user_email = "'.$email.'"');
if ( $sqlerr = $sql->getError() ) {
print 'Oops - Datenbankfehler: <br />'.$sqlerr."<br />\n";
print '<a href="'.$url_ich.'&FORM[pwd]=1">Weiter ...</a>'."\n";
}
elseif ($sql->getRows() != 1) {
print 'Die Mailadresse '.$email.' ist uns nicht bekannt.<br />'."\n";
print '<a href="'.$url_ich.'&FORM[pwd]=1">Weiter ...</a>'."\n";
}
else {
$header = 'From: '.$absender. "\r\n" .'X-Mailer: PHP/' . phpversion();
$text = 'Hallo '.$sql->getValue ('user_firstname', 0).' '.
$sql->getValue ('user_name', 0)."\n\n".
'Du hast Deine Kontaktdaten und das Passwort angefragt. Hier Deine Informationen.'."\n\n".
'_______________________________________________________'."\n\n".
'Login: '.$sql->getValue ('user_login', 0)."\n".
'Passwort: '.$sql->getValue ('user_password', 0)."\n".
'_______________________________________________________'."\n";
$betreff = 'Passwortabfrage';
if (mail($email, $betreff, $text, $header)) {
echo '<p>Ihre Zugangsdaten wurden an die Adresse <b>'.$email.'</b> geschickt</p>'."\n";
}
else {
echo '<p>Es gab ein Problem beim Versand der Zugangsdaten; bitte versuchen Sie es später noch einmal.</p>'."\n";
}
print '<a href="'.$url_ich.'">Weiter ...</a>'."\n";
}
}
/* Login: ----------------------------------------------------------------------
* Im Prinzip ist das der Programmcode aus der Redaxo-Login-Demo.
*/
elseif ($func == 5) {
$FORM[loginname] = "Login";
print '
<p>Auf den geschützten Seiten finden Sie nicht öffentliche Informationen.
Um zu den Seiten gelangen zu können, müssen Sie sich hier mit Benutzername
und Kennwort anmelden.</p>
<p>Die freigeschalteten Seiten sind anschließend über das Menü erreichbar.</p>
<p>Die Einrichtung eines Benutzernamen und Kennwort können per Mail beim
<a href="'.$webmaster.'">Webmaster</a> angefordert werden.</p>
<p>Wenn Sie Ihr Kennwort vergessen haben, klicken Sie bitte
<a href="'.$url_ich.'&FORM[pwd]=1">hier</a>.</p>
<form action="index.php" method="post">
<input type="hidden" name="article_id" value="'.$nach_login.'" />
<input type="hidden" name="FORM[trytologin]" value="1" />
<input type="hidden" name="clang" value="'.$REX['CUR_CLANG'].'" />
'.$msg.'
<table>
<tr>
<td>Name</td>
<td><input id="login" type="text" name="FORM[loginname]" value="" /></td>
</tr>
<tr>
<td>Kennwort</td>
<td><input id="paswd" type="password" name="FORM[loginpasswort]" value="" /></td>
</tr>
<tr>
<td> </td>
<td><br /><input class="submit" type="submit" value="anmelden" /></td>
</tr>
</table>
</form>
';
}
// Logout: ---------------------------------------------------------------------
else {
print
$msg.'
<p style="text-align:left;">Sie sind angemeldet als: <strong>'.$_SESSION['USER']->getValue("user_login").'</strong></p>
<p style="text-align:left;"><a href="'. $url_nach_logout .'&FORM[LOGOUT]=1">« Logout</a></p>
';
}
}
?>
Code: Alles auswählen
<?php
/* Authentifizierungs-Template für REX 4.0
Abwandlung des Original-Redaxo-Templates
Das Template ermöglicht die Einrichtung von benutzerspezifischen Bereichen.
Jeder Benutzer erhält nach seiner Anmeldung individuelle, nur für ihn
sichtbare Menüpunkte. Alle in der Hierarchie unter diesem Menüpunkt
liegenden sind ebenfalls nur für diesen angemeldeten Benutzer sichtbar.
Jedem in der (Simple-)User-Verwaltung eingetragenen Benutzer kann derzeit
ein unter Typen eingetragener Artikel-Typ zugeordnet werden.
------------------------------------------
Peter Reiche, http://www.raybeam.de
Portierung auf REX 4.0: Rudi Widmer (rudoo)
------------------------------------------
Letzte Änderung: 9.1.2008 (rudoo)
Portierung auf REX 4.0
(Open Issue: Error Language)
Letzte Änderung: 09.07.2007:
Fehler in Quelltext beseitigt
Zeile 105: ... && !$FORM[USR]) geändert in ... && !$FORM['USR'])
Letzte Änderung: 10.12.2006:
Einbindung eines "SuperUsers" der alle individuellen Menüpunkte sieht
Letzte Änderung: 10.07.2006:
Individuelle Menüpunkte in beliebiger Verschachtelungstiefe möglich
------------------------------------------
*/
// ID der Fehlerseite, die bei erfolgloser Anmeldung
// aufgerufen werden soll
$errorArticleId = "1";
// Type-ID für den "SuperUser", der alle
// individuellen Menüpunkte sehen darf
$su = 99;
setlocale(LC_ALL,"de_DE");
// -------------------------------------------------------------- USER AUTH
session_start();
$_SESSION['USR'] = false;
$user_id = 0;
$user_name = "";
if($REX['CUR_CLANG']== "0")
{
$error_lang = "de";
}
else
{
$error_lang = "en";
}
if ($_SESSION['rexsite']['UID'] !="" OR $_POST['FORM']['loginname'] != "" OR $_POST['FORM']['logout'] != "")
{
$_SESSION['USER'] = new rex_login();
$_SESSION['USER']->setSqlDb(1);
$_SESSION['USER']->setSysID("rexsite");
//
// 9.1.2008: Open Issue: Error Language für REX 4.0 (rudoo)
// $FORM['USER']->setLanguage($error_lang);
//
$_SESSION['USER']->setSessiontime(3000);
$_SESSION['USER']->setLogin($_POST['FORM']['loginname'],$_POST['FORM']['loginpasswort']);
if ($_GET['FORM']['LOGOUT'] == 1)
{
$_SESSION['USER']->setLogout(true);
}
$_SESSION['USER']->setUserID("rex_2_user.id");
$_SESSION['USER']->setUserquery("SELECT *
FROM rex_2_user
WHERE id='USR_UID'
AND login_activation=1
AND user_status='1'
AND user_typ>'0'");
$_SESSION['USER']->setLoginquery("SELECT *
FROM rex_2_user
WHERE user_login='USR_LOGIN'
AND user_password='USR_PSW'
AND login_activation='1'
AND user_status='1'");
if ($_SESSION['USER']->checkLogin())
{
$_SESSION['USR'] = true;
$user_id = $_SESSION['USER']->getValue("rex_2_user.id");
$user_name = $_SESSION['USER']->getValue("rex_2_user.user_name");
$_SESSION['USR_ID'] = $user_id;
$_SESSION['USR_TYP'] = $_SESSION['USER']->getValue("rex_2_user.user_typ");
}
else
{
$_SESSION['USR'] = false;
$err_msg = $_SESSION['USER']->message;
$_SESSION['USR_ID'] = 0;
$_SESSION['USR_TYP'] = 0;
}
}
else
{
// nicht eingeloggt und kein login
$_SESSION['USR_ID'] = 0;
$_SESSION['USR_TYP'] = 0;
}
$artPath = explode("|",$this->getValue("path").$this->getValue("article_id")."|");
$artId = $this->getValue("article_id");
foreach($artPath as $levId)
{
if($levId)
{
$lev = OOCategory::getCategoryById($levId);
if($lev->getTypeId() > 1 && !$_SESSION['USR'])
{
$hack = true;
}
else
{
if($lev->getTypeId() > 1 && $lev->getTypeId() != $_SESSION['USR_TYP'] && $_SESSION['USR_TYP'] != $su)
{
$hack = true;
}
else
{
$hack = false;
}
}
}
if ($hack)
{
header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?article_id=".$errorArticleId."&clang=".$REX['CUR_CLANG']);
exit;
}
}
?>