Rechte fuer Project Management System

Dennis Wronka

Soulcollector
Im Zuge des Umzugs von EasyLFS dachte ich mir ein Project Management System dafuer zu schreiben.
Da ich ja nun irgendwie nicht mehr einfach nur was fuer ein Projekt schreiben kann sondern eben immer im Hinterkopf behalte dass man sowas auch noch fuer ein anderes Projekt nutzen oder gar veroeffentlichen koennte hab ich dann auch gleich angefangen alles fein flexibel zu halten.

Jetzt stehe ich vor dem Problem dass ich Berechtigungen brauche.
Erstmal zur Erlaeuterung:
Es gibt User, Gruppen und Projekte.
Ein User kann natuerlich in mehreren Gruppen sein. Eine Gruppe ist entweder einem Projekt zugeordnet oder nicht (letzteres waere dann fuer die Site-Admins vorbehalten).
Die Rechte werden nicht dem User, sondern der Gruppe zugewiesen. Dadurch hat der User in jedem Projekt (da er dort jeweils in einer anderen Gruppe ist) andere Rechte.
Abbilden wollte ich die Rechte binaer, ueber einen AND-Vergleich will ich also feststellen ob die Berechtigung gesetzt ist oder nicht.

Die Theorie ist soweit klar, und auch mit der Umsetzung duerfte ich wohl keine Probleme haben.

Die Probleme hab ich jedoch bei der Erstellung der Rechte an sich.
Ich moechte von Anfang an die Rechte moeglichst vollstaendig definieren um nicht spaeter noch Aenderungen vornehmen zu muessen.
Daher wollte ich Euch um Hilfe bitten was Ihr denn so meint was an Rechten sinnvoll waere.

Dazu noch mehr zum Projekt:
Fast jeglicher Content wird schlichtweg als Document bezeichnet. Wie so ein Document aussieht wird ueber den Document-Type bestimmt, anhand dessen ein bestimmtes Template genutzt wird. Ein Document kann in den RSS-Feed einfliessen oder aber auch nicht. Zudem kann ein Document einem Projekt zugewiesen sein oder eben auch nicht.
Zusaetzlich zu den Documents gibt es auch Packages, welche das Projekt enthaelt. Bei EasyLFS waere dies z.B. die Software-Liste.

Ich hatte mir dazu folgendes ueberlegt:
Vom Site-Admin koennen User, Gruppen und Projekte verwaltet werden.
Innerhalb der Projekte soll es dann die Moeglichkeit geben Gruppen fuer bestimmte Bereiche einzurichten. So koennte z.B. eine Gruppe dafuer zustaendig sein die Paketliste zu pflegen, eine andere fuer die Dokumente.
Mal so als Beispiel halt.

Um Leserechte brauchen wir uns hierbei keine Gedanken zu machen da diese automatisch durch die Zugehoerigkeit zu einer dem Projekt zugewiesenen Gruppe kommen. Also: Wer zum Projekt gehoert darf dort alles lesen, aber nicht unbedingt alles bearbeiten.

Uebrigens, noch 2 Kleinigkeiten die zwar jetzt weniger von Belang sind, aber der Vollstaendigkeit halber nicht fehlen sollen:
Da das Ganze eventuell am Ende darauf herauslaeuft mehr oder weniger darauf zugeschnitten zu sein Distributionen zu verwalten koennte aus dem Project Management System auch ein Distro Management System werden. Das steht aber noch nicht fest.
Das Projekt wird in PHP geschrieben, was aber am Problem nichts aendert da die Implementation letztlich recht einfach ist.
Wie gesagt, es geht mir um die Erstellung eines sinnvollen Satzes an Rechten.
Denn das Problem ist eben dass ich ohne mehr oder weniger fertiges Rechte-System nicht mit dem eigentlichen Code anfangen kann, da alles eben darauf aufbauen wird.

Es waere nett ein paar Ideen zu lesen. Ich weiss dass mein Getippsel recht konfus ist, aber das wollen wir doch einfach mal der fortgeschrittenen Urzeit zuschreiben.
 
Hallo nach Hong Kong

Also neben dem Lese-Recht, würde ich auf jeden Fall Rechte zum Erstellen, Ändern und Löschen von Dokumenten definieren. Selbiges dann auch für die Pakete.
Ggf könntest du noch ein Recht für Suchen (falls du diese Funktionalität planst) definieren.

Mehr fällt mir im Moment nicht ein. Sind halt so die Standardrechte :D
 
Ich hatte vor kurzem auch mit einem etwas komplexerem Rechtesystem zutun.
Es gab: Users, Groups, Permissions und in meinem Fall Documents statt wie bei dir Projects.
Nun sollte es so sein, dass die User in verschiedenen Gruppen sein konnten aber in den jeweiligen Gruppen unterschiedliche Rechte haben sollten (bei mir auch in Binärform). Eine Gruppe war einem oder mehreren Dokumenten zugeordnet.
Um das mal zu veranschaulichen hier mal meine Tabellen in der Datenbank (aufs wesentliche gekürzt):
Code:
user
----
id
Code:
group
----
id
Code:
permission
----
id | user_id | group_id | access
Code:
documents
---
id
Code:
documents_groups
----
document_id | group_id
Die binären Rechte sahen in etwa so aus:
Code:
Read - 1
Write - 2
und wurden im access-Feld bei Permissions gespeichert.
Hier noch ein Beispiel-Szenario:
Benutzer1 ist in Gruppe1.
Dokument1 ist der Gruppe1 zugeordnet
Benutzer1 hat in Gruppe1 die Rechte Lesen und Schreiben. ( Read | Write)
Benutzer1 ist aber auch in Gruppe2 und hat dort nur Leserechte. ( Read )
Benutzer1 kann das Dokument2 aus Gruppe2 also nur lesen und nicht verändern bzw. neue Dokumente anlegen. ( access & Write -> false )

Ich hoffe ich konnte dir irgendwie weiterhelfen.
Hoffentlich hab ich das Ganze gut erklärt. :)
 
So, folgende Rechte hab ich jetzt erstmal definiert:
PHP:
define('PERM_PROJECTS',1);
define('PERM_GROUPS',2);
define('PERM_MENUS',4);
define('PERM_DOCS',8);
define('PERM_PAKS',16);
define('PERM_PROJ_PROJECTS',32);
define('PERM_PROJ_GROUPS',64);
define('PERM_PROJ_MENUS',128);
define('PERM_PROJ_DOCS',256);
define('PERM_PROJ_PAKS',512);
God-Mode ist also (zur Zeit) 1023.
Es kann aber durchaus passieren dass sich hier und da noch was aendert.

Die Ueberpruefung der Permissions erfolgt folgendermassen:
Erstmal werden mit der folgenden Funktion die "Gesamtrechte" des Users ermittelt.
Gesamtrechte bedeutet die Kombination aus globalen Rechten (also aus Gruppen mit ProjectID 0; also kein Projekt) und Projekt-Rechten (also aus Gruppen mit der ProjectID des Projektes, wobei dies auch wieder 0 sein kann wenn in globalen Menues gearbeitet wird)
PHP:
function getpermissions($user,$project,&$multisql)
{
	$resultset=$multisql->getresultset();
	$multisql->query("select `grouppermissions`.`value` from `grouppermissions` join `groups` on `groups`.`id`=`grouppermissions`.`group` where `groups`.`id` in (select `group` from `usergroups` where `user`=".$user.") and `groups`.`project` in (0,".$project.")");
	$permissions=0;
	while ($userpermissions=$multisql->fetch_assoc())
		{
			$permissions|=$userpermissions['value'];
		}
	$multisql->setresultset($resultset);
	return $permissions;
}
Ja, die SQL-Query ist ein Monster, aber ohne dieses Konstrukt waere ich auf 3 Queries gekommen und haette dann rumwursten muessen.
Wie zu sehen ist werden die einzelnen Rechte dann mittels | (OR) verknuepft und zurueckgegeben.

Ausgewertet wird dann mit einer Zeile wie dieser:
PHP:
if ((($projectno==0) && ($permissions & PERM_MENUS)) || ($permissions & PERM_PROJ_MENUS))
Diese ist jetzt, wie an den Konstanten zu sehen sein sollte, aus dem Script zur Menue-Verwaltung.

Soweit geht die Arbeit am System jetzt auch recht gut voran. Da ja fast alles ueber die DB laeuft muss ich nur jetzt eben ein Script nach dem anderen aufbauen, da einige Daten eben voneinander abhaengig sind.
Zuerst hab ich also das Script fuer Menues geschrieben, jetzt arbeite ich am Projekt-Script. Darauf aufbauend kann ich dann die Documents und Packages implementieren.
Irgendwann zwischendrin, oder am Ende, nehm ich mir dann die User- und Gruppenverwaltung vor.
 
Zurück