28. 04. 2008. | #1 |
Ivan Dilber
Sir Write-a-Lot
|
ACL liste i select na bazi?
Pravim klasican ACL sistem, baziran na ARO I ACO stablima (tj. role i konteksti), i to sve fino radi kad treba proveriti privilegije za odredjenu jednu akciju (tipa edituj taj i taj item i sl.).
Medjutim u problemu sam kako da ovo efikasno povezem sa SELECT-om veceg broja recorda odjednom, tipa treba dohvatiti 100 proizvoda koje korisnik ima pravo da vidi (a svaki proizvod moze da bude u vise kategorija i podkategorija, i sam korisnik moze da pripada u vise rola/grupa, a svaka od njih moze da ima svoj set pravila za neku od datih rola). Hteo bih da minimizujem broj upita, ali da ipak izbegnem hardkovanje privilegija u kodu po svaku cenu, vec da sve ide preko ACL i da bude maximalno univerzalno (ali onda se skroz iskomplikuje)... Jel imate neke savete kako to resiti najlakse? Ne treba mi gotovo resenje, nego cisto predlog algoritma kako je najbolje sklopiti takav upit?
__________________
Leadership is the art of getting people to want to do what you know must be done. |
29. 04. 2008. | #2 |
profesionalac
Qualified
Datum učlanjenja: 15.09.2006
Lokacija: Zemlja cuda
Poruke: 114
Hvala: 11
3 "Hvala" u 3 poruka
|
Ja bih u tom slucaju vrsio upite koji oznacavaju sta korisnik moze da uradi u sistemu prilikom logovanja i time formirao niz id-ova koje korisnik moze da koristi na ovaj ili onaj nacin (tacna struktura zavisi od toga sta ti treba).
Na stranici samo pitas da li je id datog itema u listi koju si formirao. Znam da postoje mane ovakvog pristupa ali mi se cini mnogo efikasnijim nego da za vrsis upite za svaki pojedinacni item ili vise stotina istih ako ti treba listing neke grupe ili nesto slicno... |
29. 04. 2008. | #3 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
Off Topic: sorry nemogu da odolim... SFRJ Jugoslavija |
29. 04. 2008. | #4 |
Ivan Dilber
Sir Write-a-Lot
|
Off Topic: a? ne razumem?
__________________
Leadership is the art of getting people to want to do what you know must be done. |
30. 04. 2008. | #5 |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
A šta te sprečava da napraviš jedan masniji JOIN, eventualno uz pomoć vjuova?
Off Topic: Ma ona fora: u ACL već imaš "Liste"... Na foru "LED Dioda"...
__________________
blog |
30. 04. 2008. | #6 |
Ivan Dilber
Sir Write-a-Lot
|
Off Topic: Aaaaa, /me slow Sto se tice JOIN-a, kako tacno mislis, nad kojim podacima bi radio JOIN? Ja odradim Join nad ACL tabelama i onda prolaskom kroz dobijeno stablo nadjem konkretan set pravila koja bi mogla da vaze (Deny ili Allow), ali ne umem da pretocim ta pravila u neki WHERE koji ima smisla. Recimo da imas sledeca pravila (svako sledece ima visi prioritet): 1. Allow svi proizvodi 2. Deny proizvodi za ID IN (1,3,5,7) 3. Allow proizvode (3,4,5) E sad kako od ovoga napisati WHERE koji ce pravilno dohvatiti prvih 10 proizvoda koje smemo da vidimo? Da postoji samo Allow ili samo Deny ne bi bio problem, ali konkretan zadatak zahteva da postoji i jedno i drugo. EDIT: ovako kad su sve ID-jevi moglo bi da se prvo napravi presek ID-jeva, pa da se onda uradi jednostavno WHERE id NOT IN (...), ali u realom slucaju mozda ce jedno pravilo da bude vezao za polje Uvoznik, drugo za Datum, pa je onda tesko uraditi presek, sem onako kako je Skaarj predlozio
__________________
Leadership is the art of getting people to want to do what you know must be done. Poslednja izmena od ivanhoe : 30. 04. 2008. u 00:48. |
30. 04. 2008. | #7 |
I'm a PC too.
Wrote a book
Datum učlanjenja: 06.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
^Pa čekaj, zašto ti je problem da složiš upit sa drugim poljima - ti uvek gledaš samo ID na kraju (tj. uvek imaš select id.. bilo u glavnom upitu ili ovim ispod a WHERE polje se menja), slično kao ovo gore:
select id from t1 where 1=1 /* include all */ and /* presek 2. i 3. pravila */ id not in ( select id from t1 where id in (1,3,5,7) and id not in (3,4,5) ) Naravno, ovo gore je bolje napisati pomoću JOINa, čisto performansi radi. Koliko vidim, imao bi nekoliko šablona koje bi onda složio u jedan upit, samo je zavisno šta ide kojim redom. Ima malo da se cima, nije da nema
__________________
Commercial-Free !!! Poslednja izmena od degojs : 30. 04. 2008. u 07:12. |
30. 04. 2008. | #8 |
I'm a PC too.
Wrote a book
Datum učlanjenja: 06.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
U stvari, ako ne grešim, ovo gore još lakše možeš da ukalupiš u neki šablon sa:
select id from t1 where 1=1 and id not in (1,3,5,7) or id in (3,4,5) Samo obrati na pažnju gde ide AND a gde OR, itd. Naravno, umesto ID stavljaj polje i uslov koji treba.
__________________
Commercial-Free !!! Poslednja izmena od degojs : 30. 04. 2008. u 07:16. |
30. 04. 2008. | #9 |
Ivan Dilber
Sir Write-a-Lot
|
ne znam da li ovo zadnje moze da se generalizuje, posto treba ubosti kombinaciju AND i OR koja radi ono sto meni treba, a moguce je jako puno kombinacija Allow i Deny... u svakom slucaju to bi bilo ono sto mi treba, samo moram malo da se podsetim Boolove algebre...
__________________
Leadership is the art of getting people to want to do what you know must be done. |
30. 04. 2008. | #10 |
I'm a PC too.
Wrote a book
Datum učlanjenja: 06.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
Jes vala, morao bi malo da probavaš da vidiš ima li neki šablon
A mogao bi i drugačije i naokolo: da napraviš svaki put privremenu tabelu (možda čak u memoriji) i da za nju izvršiš odgovarajuće INSERT i DELETE id-ova. Npr ako imaš ovako pravila: 1. Allow All: SELECT Id FROM t1 WHERE 1=1 -> i sad te IDjeve INSERTuješ u tu privremenu ("temp") tabelu, ne znam sad koja je sintaksa za MySQL da radi SELECT i INSERT u jednom upitu, verujem da ima, sve baze to imaju 2. Deny 1,4,6: DELETE FROM temp WHERE ID IN (1,4,6) 3. Allow 7,4,3: INSERT INTO temp WHERE ID IN (7,4,3) I tako redom. I na kraju ti u toj temp tabeli ostanu IDjevi koje trebaš. E sad, ono prvo pravilo može da povuče dosta ID-jeva, pa možeš malo da optimizuješ logiku pa da ni ne radiš taj prvi upit, već da beležiš šta se uklanja iz skupa svih ID-jeva, itd. U stvari možda ti ni ne treba baza i privremena tabela za to onda, već da radiš sa nizom/kolekcijom/skupovima..?
__________________
Commercial-Free !!! Poslednja izmena od degojs : 30. 04. 2008. u 22:43. |
|
|
Slične teme | ||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
Select box - IE6 stilizovanje | Nemanja.Milosavljevic | (X)HTML, JavaScript, DHTML, XML, CSS | 8 | 18. 01. 2010. 16:54 |
Top liste sajtova | Marko Medojevic | Sva početnička pitanja | 0 | 25. 10. 2007. 18:59 |
stilizovanje <select> tag-a | [nq] | (X)HTML, JavaScript, DHTML, XML, CSS | 11 | 24. 06. 2007. 21:55 |
Select language ... | Ivan | Opušteno | 32 | 22. 12. 2006. 14:40 |
sta su zapravo mail liste | dee | PHP | 4 | 01. 09. 2006. 12:12 |