aller Anfang... ( PHP / MYSQL )

simily

Grünschnabel
Hallo Ihr,

ich habe vor eine Art CMS zu erstellen mit folgenden hierarchie Rechten:

1. ( Super Administrator )
2. Administrator
3. Gruppen
3.1. Mitglieder
3.1.1 Benutzer

Erklärung:
Mitglieder werden in Gruppen eingeordnet können auch mehreren Gruppen angehören.
Mitglieder haben n Anzahl von Benutzern. Es soll dadurch möglich sein "Add on´s" o.ä. zu oder abschalten zu können.

Benutzer sind Personen die "nur" von Mitgliedern angelegt werden können, d.h. Benutzer können sich nicht selber anlegen.
Es ist nicht möglich das ein Benutzer mehreren Mitgliedern angehört.

Ich habe mir schon das bit flag System angeschaut, bin damit aber nicht wirklich "warm" geworden.

Wäre es sinnvoller 1 Tabelle zu erstellen ( id / name / passwort / rechte / gruppe ) oder
lieber 3 Tabellen ( id / name / passwort / ... ) ; ( id / rechte ) ; ( id / gruppe )

Danke vorab für eure Hilfe...

Beste Grüsse

Oliver
 
3 Tabellen sind dafür besser geeignet:
Code:
<!-- table_users -->
userid, name, groupids

<!-- table_groups -->
groupid, name

<!-- table_grouprights -->
groupid, allow_reading, allow_writing, ...

Zu den Bitmasken:
Jede Gruppe bekommt eine 2er Potenz zugewiesen. Bei mehreren Gruppen werden diese addiert. Mithilfe der bitweisen und Verknüpfung kannst du dann testen, ob jemand Mitglied in einer bestimmten Gruppe ist.
PHP:
define('GROUP_ADMIN', 1);
define('GROUP_MOD', 2);
define('GROUP_MEMBER', 4);
define('GROUP_USER', 8);
define('GROUP_PROGRAMMER', 16);
define('GROUP_MUSICIAN', 32);

$user[0] = GROUP_ADMIN;
$user[1] = GROUP_MOD + GROUP_PROGRAMMER;
$user[2] = GROUP_USER + GROUP_PROGRAMMER + GROUP_MUSICIAN;

foreach( $user as $u ){
  if( $u & GROUP_ADMIN ) echo 'Der User ist Admin';
  if( $u & GROUP_MOD ) echo 'Der User ist Moderator';
  if( $u & GROUP_MEMBER) echo 'Der User ist Mitglied';
  if( $u & GROUP_USER) echo 'Die Aussage klingt blöd: Der User ist User';
  if( $u & GROUP_PROGRAMMER ) echo 'Der User ist Programmierer';
  if( $u & GROUP_MUSICIAN ) echo 'Der User ist Musiker';
}
 
Dachte es wäre so einfacher zu verstehen. Letztendlich ist es ja das gleiche in grün, aber ich gebe Dir recht, es ist sauberer :)
 
Danke vorab für die ganzen Infos.
Ich habe doch noch einmal eine kleine Frage...
Wenn ich jetzt die drei Tabellen benutze
Code:
<!-- table_users -->
userid, name, groupids
 
<!-- table_groups -->
groupid, name
 
<!-- table_grouprights -->
groupid, allow_reading, allow_writing, ...

dann fehlt mir doch trotzdem noch die Zuordnung vom einfachen Benutzer zum Mitglied oder nicht? ( bit flags mal aussen vor gelassen).
Bei allow_reading usw. ist es dann besser 'no' & 'yes' zu benutzen oder '1' & '2' für an und aus?

Danke für eure Hilfe!
 
Für Werte die nur 2 mögliche Werte annehmen können, sollte man booleans nehmen (true/false). Das ist ja hier bei dir der Fall.

edit:
Erste Frage überlesen...
Nein, dir fehlt hier nichts. Du erstellst einfach eine Gruppe Benutzer und eine Mitglied (im Bitflagsystem) und kannst einem User so mehrere groupids zuweisen. (Weitere Gruppen natürlich dann für Admin, Moderator ... )
Du Verknüpfst alle groupid Bits die ein Nutzer haben soll mit der Bitweisen Oderverknüpfung ( | ) und trägst diese beim user in "groupids" ein.
 
Zuletzt bearbeitet:
hey,
ich wollte nur kurz wissen ob ich die mysql Datenbank richtig erstellt habe und die richtigen Werte benutzt habe... ( Ich habe das Passwort absichtlich noch nicht verschlüsselt )
Wenn die Datenbanken und Einträge so stimmen müsste ich doch nur noch per boolean auslesen ob die Werte 0 oder 1 bzw. true oder false ergeben und danach checken ob der "Benutzer" Zugriffsrechte und "allow_reading" , allow_what ever" besitzt oder nicht?
Danke!
Bin noch am lernen!
SQL:
CREATE TABLE `grouprights` (
  `groupid` int(100) NOT NULL,
  `allow_reading` tinyint(1) DEFAULT NULL,
  `allow_writing` tinyint(1) DEFAULT NULL,
  `allow_upload` tinyint(1) DEFAULT NULL,
  `allow_newuser` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`groupid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `grouprights`
--

INSERT INTO `grouprights` VALUES(1, 1, 1, 1, 1);
INSERT INTO `grouprights` VALUES(2, 0, 0, 1, 1);
INSERT INTO `grouprights` VALUES(3, 0, 1, 1, 0);

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

--
-- Tabellenstruktur für Tabelle `groups`
--

CREATE TABLE `groups` (
  `groupid` int(100) NOT NULL,
  `name` varchar(35) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`groupid`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `groups`
--

INSERT INTO `groups` VALUES(1, 'admin');
INSERT INTO `groups` VALUES(4, 'member');
INSERT INTO `groups` VALUES(8, 'user');

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

--
-- Tabellenstruktur für Tabelle `users`
--

CREATE TABLE `users` (
  `userid` int(100) NOT NULL AUTO_INCREMENT,
  `name` varchar(35) CHARACTER SET utf8 NOT NULL,
  `groupid` int(100) NOT NULL,
  `pass` varchar(20) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`userid`),
  UNIQUE KEY `name` (`name`,`pass`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Daten für Tabelle `users`
--

INSERT INTO `users` VALUES(1, 'admin', 1, 'admin');
INSERT INTO `users` VALUES(2, 'member', 2, 'member');
INSERT INTO `users` VALUES(3, 'user', 4, 'user');
 
Zuletzt bearbeitet:
Zurück