Wie kann man Benutzern verschiedene Rechte hinzufügen?
Nur Benutzer mit dem Recht recht1 sollen dann einen Link sehen!
Wie geht das?
Anfängerfrage ist das wirklich nicht. Also grundsätzlich brauchst du dafür ja schonmal eine Unterscheidung für Personen. Das geht am besten über ein Login. Und dann musst du irgendwo die Berechtigungen abpeichern (zum Beispiel in einer Datenbank). Das Ganze ist schon ein wenig komplizierter. Ich würde dir raten, erst andere Sachen zu probieren Denn Rechtevergabe ist schon kompliziert
definitiv
Uups (:-o) ich hatte gedacht das ist eine ganz schöne Anfängerfrage ! Hätte den jemand einen Code für mich???
Das bedarf eine ganze Planung. Datenbank-Design, Sicherheitsabfragen vor SQL-Injections usw. Da wirst du nicht mal eben Code finden
Denn das sollten minimum 5 Dateien a 50 zeilen oder mehr sein
Wie gesagt. probier dich erst mal an etwas anderem
Das sagt mir jeder, bei CSS, C++ usw. !
Kann sein, dass sie es da sagen Weiss ja nicht was du da angefordert hast. Aber willst du das denn nicht lieber lernen wie es geht? Denn dann kannst du dir so einen Code vollkommen alleine zusammen schustern und du verstehst ihn auch noch, sodass du ihn wieder beliebig editieren kannst
Wenn du die PHP Grundlagen drin hast (Schleifen, Abfragen, Variablen, Arrays etc), kannst du dich mal mit Mysql beschäftigen. Damit kannst du dir dann eine Grundlage schaffen.
Des Weiteren wirst du wohl noch Sessions benötigen
Also folgende Reihenfolge:
- Grundlagen
- Mysql
- Session
Aus diesen Sachen kannst du dir ein login und im nachhinein noch eine Berechtigung basteln
hör auf irgendwas erschaffen zu wollen, versuch mal was lernen zu wollen
arbeite am besten mal ein php buch durch.
Ich arbeite ein PHP-Buch durch!
ums gleich vorweg zu nehmen: du musst die benutzergruppen voneinander unterscheiden können. das passiert mit einem zusätzlichen nutzermerkmal, beispielsweise mit einer spalte „recht“. da kannst du
adm - admin
smod - supermod
mod - mod
usr - user
setzen und dann bei kritischen operationen bestimmen, welchem kürzel was zugeteilt wird.
ist nur ein beispiel, kann man auch professioneller lösen.
Nils aka XraYSoLo
In dem Buch kam nicht drin vor wie ich abfrage welche Personwelche Rechte habe und diese als Variable speichere, könnte mir das jemand erklären?
Habe mal ein wenig was gebastelt ohne Datenbanken und OOP und FrontController-Layout. Der Code dürfte selbsterklärend sein. Kommentare waren mir dann wirklich zu viel.
Hinweis: Das Beispiel soll nicht mehr als einen ersten Ansatz liefern, dass das so nicht wirklich schlau gelöst ist, ist mir bewusst.
index.php
[php]<?php
require_once ‚./inc.user.php‘;
require_once ‚./inc.session.php‘;
session_start();
hansi3000_session_init();
$errors = array();
// Formulare verarbeiten
if (isset($_POST[‚formId‘])) {
if ($_POST[‚formId‘] == ‚login‘) {
// Login
if (hansi3000_user_doLogin($_POST[‚username‘], $_POST[‚password‘])) {
$_SESSION[‚username‘] = $_POST[‚username‘];
} else {
$errors = ‚Login fehlgeschlagen!‘;
}
} else if ($_POST[‚formId‘] == ‚logout‘) {
// Logout
$_SESSION[‚username‘] = ‚‘;
}
if (count($errors) == 0) {
// Seite einmal "weiterschubsen", um $_POST-Daten zu löschen
header('location: http://' . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME']);
exit;
}
}
$user = hansi3000_user_getUserData($_SESSION[‚username‘]);
header(‚Content-Type: text/html; charset=utf-8‘);
?>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>demo</title>
</head>
<body>
<?php if (count($errors) > 0): ?>
<h2>Fehler</h2>
<?php foreach ($errors as $error): ?>
<p><?php echo htmlspecialchars($error); ?></p>
<?php endforeach; ?>
<?php endif; ?>
<?php if ($user['username'] == ''): ?>
<form method="post" action="">
<p>Name: <input type="text" name="username" /></p>
<p>Passwort: <input type="password" name="password" /></p>
<p><input type="hidden" name="formId" value="login" />
<input type="submit" value="Login" /></p>
</form>
<?php else: ?>
<p>Eingeloggt als: <?php echo htmlspecialchars($user['username']); ?></p>
<form method="post" action="">
<p><input type="hidden" name="formId" value="logout" />
<input type="submit" value="Logout" /></p>
</form>
<?php endif; ?>
<?php if (in_array('content_administer', $user['rights'])): ?>
<p>Sie haben Administrationsrechte.</p>
<?php endif; ?>
<?php if (in_array('content_create', $user['rights'])): ?>
<p>Sie können Inhalt erstellen.</p>
<?php endif; ?>
<?php if (in_array('content_view', $user['rights'])): ?>
<p>Sie können den Inhalt sehen.</p>
<?php endif; ?>
</body>
[/php]
inc.user.php
[php]<?php
function _hansi3000_user_getRightsByGroup($groupName)
{
$rights = array(‚content_view‘, ‚content_administer‘, ‚content_create‘);
$groups = array(
// Alle Rechte
'admin' => $rights,
// Keine Rechte
'guest' => array(),
'user' => array('content_view'),
'editor' => array('content_create')
);
if (isset($groups[$groupName])) {
$rights = $groups[$groupName];
} else {
$rights = array();
}
return $rights;
}
function _hansi3000_user_getUsers()
{
$users = array();
$users['admin'] = array('password' => 'test', 'groups' => array('admin'));
$users['hansi3000'] = array('password' => 'abc123', 'groups' => array('user', 'editor'));
$users['mermshaus'] = array('password' => 'def456', 'groups' => array('user'));
return $users;
}
function hansi3000_user_getUserData($username)
{
$users = _hansi3000_user_getUsers();
$ret = null;
if (isset($users[$username])) {
// Eingeloggter Nutzer
$ret = $users[$username];
$ret['username'] = $username;
} else {
// Gast
$ret = array(
'username' => '',
'groups' => array('guest')
);
}
$rights = array();
foreach ($ret['groups'] as $group) {
$rights = array_merge($rights, _hansi3000_user_getRightsByGroup($group));
}
$ret['rights'] = $rights;
return $ret;
}
function hansi3000_user_doLogin($username, $password)
{
$users = _hansi3000_user_getUsers();
$ret = false;
if (isset($users[$username])
&& $users[$username]['password'] == $password
) {
$ret = true;
}
return $ret;
}[/php]
inc.session.php
[php]<?php
function hansi3000_session_init()
{
// Standardwert setzen, falls keine Session existiert
if (!isset($_SESSION[‚username‘])) {
$_SESSION[‚username‘] = ‚‘;
}
}[/php]
Initialisieren eines Nutzers auf einer Nicht-Login-Seite:
[php]<?php
require_once ‚./inc.user.php‘;
require_once ‚./inc.session.php‘;
session_start();
hansi3000_session_init();
$user = hansi3000_user_getUserData($_SESSION[‚username‘]);
?>
[/php]Danke für die Mühe! Das erlärt wirklich einiges!
PS: Bei inc.user.php und inc.session.php hast du den Endetag (?>) vergessen.
PS: Bei inc.user.php und inc.session.php hast du den Endetag (?>) vergessen.
Das ist kein Bug, sondern ein Feature. Die schließenden Tags werden nicht gebraucht, wenn kein Inhalt mehr auf den PHP-Code folgt. Hinter ihnen könnten aber noch (aus Versehen) Zeilenumbrüche oder Leerzeichen folgen (Whitespace), die beim Einlesen der Datei als HTML-Ausgabe an den Browser geschickt würden, was oft die Ursache für „headers already sent“-Fehler ist.
In Dateien, die nur PHP-Code enthalten, ist es guter Stil, den Endtag wegzulassen.
So schwer ist das garnicht. Ein Bsp:
Z.B eine Datei mit folgendem Inhalt, durch Tab getrennt, Name z.b. 7.right:
1 1 1 1 0 1 0 0 1
Feld0 : darf Administrieren
Feld1 : darf Eintrag machen
Feld2 : darf User anlegen
Feld2 : darf Eintrag löschen
und so weiter
Wenn du nun z.b. prüfen willst, ob User 7 Einträge löschen darf, dann liest du die Datei 7.right aus und analysierst Feld 3 ob dort 1 oder 0 steht.
Bastel dir am Besten eine Funktion, die dir ein bestimmtes Feld zu einer Userid analysiert und gib ja oder nein zurück.
z.B.
[PHP]
function get_user_right($userid,$feld=0)
{
$wert = file($userid.„.right“);
$rights = explode(„\t“,$wert[0]);
return trim(chop($rights[$feld]));
}
[/PHP]auf Bedarf kannst du nun deine Rechte so abfragen:
[PHP]
if(get_user_right(7,3) == 1)
{
//darf was machen
}
else
{
// darf nichts machen
}
[/PHP]Faustregel:
je einfacher eine Rechteprüfung ist, um so sicherer ist sie.
und JA, ich lege Rechte wirklich gerne in Dateien und nicht in der Datenbank ab, so kann ich z.b. das Recht, ob die Datenbank repariert werden darf auch dann prüfen, wenn die Datenbank defekt ist…
ps.
Code aus den stegreif, kleiner Fehler also möglich und das ist natürlich nur ein Ansatz…
Danke auch für diese Methode sie ist vielleicht ein bisschen üversichtlicher :), nichts gegn die Arberit von Mermshaus
Umgehen kannst du das KONZEPT sicher nicht und infiltrieren kann man es auch nicht. Der einzige Weg wäre, die Datei zu bearbeiten, was man leicht verhindern kann. Der Code ist also nicht unsicher. Die Länge von Mermaus kommt vom Login und der Gruppenverwaltung (Deine Frage ging aber eindeutig in Richtung User-Rechte).
Ich setze das PRINZIP (es ist ja bitte auch nur ein Ansatz) seit vielen Jahren ein und habe noch keinerlei negative Erfahrungen damit.
Der Unterschied:
Meine Rechte liegen in einer Datei, die man beliebig (ohne Edit des Scripts) erweitern kann und die auch online bearbeitet werden kann.
Und nochmal, es ist ein Ansatz, den man ausbauen und erweitern kann. Natürlich habe auch ich eine User, Gruppen und Ausnahmen Verwaltung, entsprechend länger wird der Code.
(Deine Frage ging aber eindeutig in Richtung User-Rechte).
Ja, ich habe ein wenig antizipiert. Ich dachte mir, eine Version mit funktionierendem Login würde Folgefragen vorgreifen.
Mir ist dabei wieder aufgefallen, wie schwierig es ist, sowas „halbwegs nachvollziehbar“ ohne OOP und komplexere Persistenzschicht (in der Regel eine Datenbank oder eben wie bei sysop) umzusetzen. (Und es kommt mir irgendwie sinnlos vor.) Es braucht doch einen Grundumfang an „Infrastruktur“-Code, der solche Beispiele immer etwas abstrus aussehen lässt.
Ich nutz des gleiche auch in meinem CMS, nur halt in ner Datenbank mit nem Foreign Key anstatt .right Dateien. Hab auch noch nie Probleme gehabt.
Ich weiß, Du wirst DIch gleich wieder fürchterlich bei mir beschweren oder glauben, dass ich Dir nichts zutraue usw. usf.
Aber ziehst Du eigentlich derzeit auch irgendwas durch? In allen Unterforen trifft man Dich an, wo Du fragst, wie dies und das funktioniert, fast alles sind Fragen, die sich schon manch Experte gestellt hat und die man nicht so einfach beantworten kann, für die man immer Grundwissen braucht. Aber davon scheinst Du noch gar nichts zu haben.
Du solltest aufhören, in alle Bereiche reinschnuppern zu wollen und Dir ein einziges Ziel setzen, was Du wirklich erreichen willst. Zu diesem einen einzigen Thema gibt es genug, was Du lernen kannst und musst. Das solltest Du bis zum Ende durchziehen und auch mit kleinen Schritten anfangen.
Ich weiß ja nicht, ob Du so ein Supertalent bist, das eine Klasse übersprungen hat, so dass Du gleichzeitig HTML, CSS, PHP, MySQL, C++ und was Du noch alles nachgefragt hast, lernen kannst und das dann auch verstehst. Den Eindruck machst Du aber nicht. Du kommst mir vor wie ein normaler Mensch in dem Alter.
Ich hab selbst einen Sohn in Deinem Alter und ich weiß, wie wissbegierig der ist. Er macht jetzt mit Freude Robot Karol und kriegt von mir so die Programmiergrundlagen beigebracht. Irgendwann lernt er dann vielleicht mal HTML&Co. Aber eben immer eines nach dem anderen, sonst hat das alles überhaupt keinen Sinn.
Weißt Du, wir helfen Dir gerne, aber wenn Du an allen Ecken und Enden nachfragst, wie dies und das geht, dann nimmt Dich keiner mehr Ernst. Überleg Dir, was Du am liebsten machen würdest (klein anfangen) und dann leg los. Wir stehen Dir schon zur Seite, aber wenn Du auf drei Baustellen arbeitest, dann klappt das nicht.
Nett gemeinte Grüße,
-Efchen