Kom ihåg mig?
Home Menu

Menu


Hantering av användarrättigheter

Ämnesverktyg Visningsalternativ
Oläst 2005-06-13, 22:21 #1
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
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!
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-13, 22:34 #2
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
Citat:
Originally posted by Tvartom@Jun 13 2005, 22:21
Edit: Funderar även på att lägga hela hirakin i en table:
id, parent, objekttyp, objektid
om det underlättar!
Denna modell gör att du inte blir bunden till ett visst antal nivåer, så jag skulle satsa på denna. Lägg bara till en kolumn som låter varje rad peka mot en behörighet (eller behörighetsgrupp: beroende på hur du har tänkt dig att implementera rättigheter).

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?
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-13, 22:43 #3
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Citat:
Ursprungligen postat av Robert
Denna modell gör att du inte blir bunden till ett visst antal nivåer, så jag skulle satsa på denna. Lägg bara till en kolumn som låter varje rad peka mot en behörighet
Jupp, det var det som slog mig precis när jag skrev inlägget!
Tror jag kör på det!
Citat:
Originally posted by -Robert@Jun 13 2005, 21:34
Vad behöver du hjälp med mer specifikt? Sql?
Citat:
Ursprungligen postat av Robert
beroende på hur du har tänkt dig att implementera rättigheter
Det är detta jag behöver hjälp med, hur jag ska implementera rättigheterna! Grundstruktur!

/ Lasse
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-13, 23:33 #4
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Citat:
Originally posted by Tvartom@Jun 13 2005, 21:21
lägga hela hirakin i en table:
id, parent, objekttyp, objektid
Finns det något sätt att skriva en SELECT-sats
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;
och det funkar inte!

/ Lasse
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-14, 08:44 #5
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
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".
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-18, 12:08 #6
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
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
Med denna struktur kan man skriva extremt mycket mer flexibla sqlfrågor.
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
(Ta bort '=' om du vill utesluta startnoden)

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
Kruxet är ju att lägga till, ta bort och flyta noder, men funktionerna var inte
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
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-18, 13:56 #7
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
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
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-18, 21:12 #8
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Citat:
Originally posted by Robert@Jun 18 2005, 12:56
Du kan alltid spara lite querytid genom att spara info om antalet barn på raden då denna ändras väldigt sällan.
Ja, spara querytid är just vad jag försöker göra nu...

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)
Vilket inte uppskattades av mysql...
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)
Jag har försökt med att lägga index på uppe och nere, utan nämvärt resultat.
(Även testat på arv...)

/ Lasse
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-19, 21:11 #9
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Citat:
Originally posted by Tvartom@Jun 18 2005, 20:12
Fråga 2 är, kan jag göra något för att snabba upp kravarv-queryn?
Kod:
SELECT BIT_ORkrav AS kravarv FROM t1 AS path WHERE path.uppe = uppe AND path.nere = nere
Skrev om beräkningen så den blev blixtsnabb... förklarar om nån e intresserad!
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 12:05.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017