FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
Hej!
Sitter och försöker strukturera upp ett system med olika användarrättigheter, men skisserna jag har tycker jag har blivit lite väl invecklade, med sql-frågor som börjar lika uppsatser! (Använder PHP & MySQL) Jag har ett system med olika användare samt hiraktiska objekt (Objekten är av olika typer). Objekt_typ1 | |-objekt_typ2 | --objekt_typ2 . | . |-objekt_typ3 . --objekt_typ3 För att bygga hirakin: objekt_typ2 och typ3 har varsin parent-fält i db:n för att ange objekt_typ1 respektive objekt_typ2. Nu utvecklar jag ha ett behörighetssystem som kan hantera, att man sätter olika behörigheter på olika objekt (Ex: Dold!) Egenskapen ska även ärvas neråt. (Om typ2 är dold så ska alla typ3-barnen vara lika så) En användare ska även kunna få rättighet att se ett specifikt objekt (Ex objekt_typ3,id=8) Ganska likt windows-filsystemsrättigheter med andra ord! Hur löser man dett på ett snyggt sätt i en databas? Någon som sett liknande? / Lasse Edit: Funderar även på att lägga hela hirakin i en table: id, parent, objekttyp, objektid om det underlättar! |
||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Klarade millennium-buggen
|
Citat:
Om du har denna struktur dock så bör du se till så att du inte får någon loop (1 -> 2 -> 3 -> 1 -> etc etc) men det kan du ju skippa om det är du själv som ska lägga upp strukturen. Vad behöver du hjälp med mer specifikt? Sql? |
|||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Medlem
|
Citat:
Tror jag kör på det! Citat:
Citat:
/ Lasse |
|||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Medlem
|
Citat:
som plockar ut hela trädet uppåt? Jag testade med följande något motsägelsefulla query: Kod:
SET @nextid=3; SELECT * FROM struktur WHERE id=@nextid AND (@nextid:=parent) LIMIT 0, 30; / Lasse |
||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Klarade millennium-buggen
|
Rättigheter kan göra på många olika sätt.
Ett sätt som blir lätt att administrera om du behöver ändra rättigheterna mera "globalt" är att se till så att en användare har en pekare mot en säkerhetsgrupp (lite som i windows...) sen så har du tex ett fält i säkerhetsgruppen där du anger endera en nivå som du själv hittar på (1,2,3,...). Eller så går du ner på detaljnivå per grupp och låter summan av alla rättigheter för enskilda rader vara det tal som du använder för att kolla behörighet. (shit, svårt att förklara). Kod:
User SecurityGroup ================= Bengan 2 Larsa 1 Nisse 1 Säkerhetsgrupp Beskrivning ===================== 1 Administratör 2 Editor 3 Användare ..din tabell pekar sedan mot säkerhetsgruppstabellen. ELLER så ändra till denna lite mer lågnivåmodell: User SecurityGroup ================= Bengan 2 Larsa 1 Nisse 1 Säkerhetsgrupp Beskrivning Rättighet ============================== 1 Administratör 137 2 Editor 128 3 Användare 1 Rättigheter Beskrivning ============================== 1 Login 2 Forum-läs 4 Forum-skriv 8 Forum-radera 16 News-ny 32 News-radera 64 Medlemsadm-ny 128 Medlemsadm-radera 256 blablabla... ... Rättigheterna i säkerhetsgruppen är alltså summan av de rättigheter alla i den gruppen ska ha. Exempelvis Nisse pekar mot administratör. Administratörsgruppen har rättighet 137 vilket betyder, i rättighetstabellen, rättighet (128+8+1) = 137. Sen får du, i ditt serverspråk, använda lämplig funktion för att kolla om den aktuella rättigheten finns i den aktuella användarens grupps "rättighetssumma". |
|||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Medlem
|
Jag surfade runt och fick ihop en del idéer och löste problemmet!
Tänkte lite kort dela med mig av min lösning om nån som har funderat på samma sak! Jag skapade en trädtabell. Utöver parent_id angav jag även 3 till fält: Kod:
id parent_id level uppe nere post 1 1 0 1 1 8 post 1:1 2 1 2 2 3 post 1:2 3 1 2 4 5 post 1:3 5 1 2 6 7 post 2 4 0 1 9 10 Men en enda fråga kan man få ut precis den del av trädet man vill ha (Uppåt, neråt, djupbegränsning, sökväg etc) Men en subquery kan man även få saker till att ärvas, både uppåt och neråt: Följande plockar ut trädet från noden id=1 Även ett fält vid namn krav finns med, vilket ärvs neråt! (Med en OR-funktion) Kod:
"SELECT uppe, nere FROM t1 WHERE id =".$id "SELECT tree.*,(SELECT BIT_OR(krav) FROM t1 AS path WHERE path.upp_id <= tree.upp_id AND path.ner_id >= tree.ner_id) AS kravarv FROM t1 AS tree WHERE tree.upp_id >= ". $uppe." AND tree.ner_id <= ".$nere Det finns väldigt mycket man kan trolla med detta, exempelvis så räknar följande column ut antalet barn: Kod:
CAST((tree.nere - tree.uppe - 1)/2 AS UNSIGNED) AS antal_barn så svåra att skriva! Detta löste MÅNGA av de problem jag har funderat över och förenklade massor! Tack för hjälpen, det gav mig en del tips och ideér! / Lasse |
||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Klarade millennium-buggen
|
Du kan alltid spara lite querytid genom att spara info om antalet barn på raden då denna ändras väldigt sällan.
Ändras sällan + många frågor = lagra i tabellen Ändras ofta + få frågor = räkna ut med sql |
|||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Medlem
|
Citat:
Jag håller på att testa systemet och har fyllt upp 12000 poster i trädet (Hoppas på att det ska klara mer..) Räkna ut antalet barn påverkar inte tiden nämvärt, utan kravarv är den tunga posten. Att plocka ut 100 poster kan ta upp mot 8 sekunder som det är just nu, så något måste göras! Så därför tänkte som jag Robert föreslår, spara kravarv som ett extra fält. (som cache) Frågan är nu, hur skriver man uppdateringen av detta fält? Försökte med: Kod:
SQL: UPDATE t1 AS tree SET kravarv = (SELECT BIT_OR(krav) FROM t1 AS path WHERE path.uppe <= tree.uppe AND path.nere >= tree.nere) Måste man köra det via en tillfällig tabell eller finns det någon annan lösning? Fråga 2 är, kan jag göra något för att snabba upp kravarv-queryn? Kod:
SELECT BIT_OR(krav) AS kravarv FROM t1 AS path WHERE path.uppe <= $uppe AND path.nere >= $nere) (Även testat på arv...) / Lasse |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Medlem
|
Citat:
|
||
![]() |
![]() |
Svara |
|
|