DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   PHP (http://www.devprotalk.com/forumdisplay.php?f=9)
-   -   ACL liste i select na bazi? (http://www.devprotalk.com/showthread.php?t=5238)

ivanhoe 28. 04. 2008. 21:21

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?

skaarj 28. 04. 2008. 23:52

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...

cvele 29. 04. 2008. 10:58

Off Topic:
sorry nemogu da odolim...

SFRJ Jugoslavija :)

ivanhoe 29. 04. 2008. 18:17

Off Topic:
a? ne razumem?

jablan 29. 04. 2008. 23:13

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"... :)

ivanhoe 29. 04. 2008. 23:42

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

degojs 30. 04. 2008. 05:59

^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 :)

degojs 30. 04. 2008. 06:12

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.

ivanhoe 30. 04. 2008. 20:55

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...

degojs 30. 04. 2008. 21:39

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..?


Vreme je GMT +2. Trenutno vreme je 02:41.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.