D7: Bővített jogosultság kezelés

Dean képe

Sziasztok!

A következő kérdésem lehet elemi, de fontos dolgot vet fel:

Tudtommal a Drupal rendszer annak eldöntésére, hogy egy tartalmat egy adott user számára megjeleníthet-e vagy sem elsősorban a szerepköröket használja. Persze ott van még a közzététel meg egyebek, de lényegében azon dől el hogy azt a valamit láthatom vagy sem, hogy benne vagyok-e egy adott szerepkörben.

Nos, ezt szeretném bővíteni, mert a rengeteg szerepkör létrehozása szerintem nagyon nem szerencsés.

Tegyük fel hogy egy áruházban árulok valamit.
Ha valaki ezt megveszi, akkor jogot vett arra, hogy valahol valamit megtekinthessen. Ha csak néhány valamit árulok, akkor akár még a szerepkör is megtenné, de mi van ha nagyon sok mindent árulok?

Lehetséges-e egy olyan megoldás, hogy mondjuk létrehoznék egy tartalom típust, ami arra lenne hivatott, hogy kiegészítse a szerepkörök jogosultság kezelését?
Így a web áruházban nem szerepkört vásárolna a user, hanem egy ilyen node-ot. Vagy user refrence-el hozzárendelődne egy ilyen node-hoz.
A lényeg, hogy 10-nél több szerepkört nem szívesen használnék és megtartanám a hagyományos használatukat.

Ebből a node típusból viszont bármennyit létrehozhatok, amennyi eladandó termékem csak van. Lehet akár több 100 vagy több 1000 is.
A Rules-ban megoldanám, hogy egy vásárlás esetén a user hozzárendelődjön a termékkel kapcsolatos node-hoz.
Innentől jönne a kérdés:

Elkerülhetetlen a Core rendszer átírása ha valami olyasmit szeretnék, hogy egy valamilyen node megtekintéséhez a szokásos szerepkörökön kívül, egy ilyen "szimulált" álszerepkör node is bejátszon?

Tehát ha benne van az Admin szerepkörben, akkor persze lásson mindent.
De ha nincs benne ÉS / Viszont "birtokol egy megadott node-ot" (user ref, vagy valami hasonló), akkor mégis megtekinthesse ezt a node-ot?

Gyakorlatilag nekem mindegy hogy milyen entitás játszik még be csak ne a szerepkör legyen!

Jó lenne ha lenne ilyesmit megvalósító modul, de már az is remény lenne számomra ha pár hasznos modullal össze lehet azért ilyet hozni és nem kell a Drupal Core rendszer függvényeibe beleírni ezért.

Csináltatok ti már valami hasonlót?

dj képe

lenne az értékesítő felület. Ha valaki a commerce-ben vásárol valamit akkor több entitás is létrejön ami a "tulajdonában" van. Először egy rendelés (commerce_order) és ezen belül a product line item reference amiből kinyerhető a termék amit megvett.

Ebből kellene kiindulnod, nem kellene további node vagy entitás ahhoz, hogy megállapítsd, hogy a felhasználónak milyen termékekhez van jogosultsága.

1
0

Üdv!
Dudás József

Dean képe

Ez jó meglátás, tehát feleslegessé tenné külön tartalomtípus létrehozását.
Viszont a line item-ben szereplő product id-vel hogyan adok jogot bármihez is?

Nagy valószínűséggel hacsak nincs erre valamiféle kész modul nem úszom meg modul fejlesztés nélkül.
Egy időben nézegettem még a Commerce License modult, de valamiért nem tudtam működésre bírni. Pedig azt hittem, hogy nem csak file szintű erőforrásokra alkalmas, hanem node-okra is. Lehet csak bénáztam és tovább kéne kísérletezni vele.

Ezért kérdezem, hogy ha nagyon nem találok semmit elvileg ugye lehetséges olyan segédmodult írni, amelyik kibővíti a szerepkörök jogosultság kezelését?
Akár a line item-ben lévő product(node) id-t is használni lehetne úgy mintha szerepkör lenne?

0
0
dj képe

a termékeket, megadod a lejárati időt pl. 30 nap és a hook_node_load vagy hook_node_view-ben ellenőrzöd, hogy a felhasználó megvásárolta-e a hozzárendelt terméket és mikor. Ha időben van akkor megmutatod a node-ot, ha nem akkor átirányítod vásárlás oldalra.

Ha ezt book szerűen hozod létre akkor elég a root node-ban ezeket meghatározni, abból levezethető a többire is.

1
0

Üdv!
Dudás József

nevergone képe

Szia!

Az ötleted majdnem jó, de szerintem szép példa arra, hogyan ne használjunk hook-okat. A hozzáférés-jogosultság vizsgálatára ugyanis van külön: hook_node_access()

A hook_node_load()-ot és a hook_node_view()-et ezzel terhelni szerintem elég nagy erőforrás-pazarlás, nem is erre találták ki őket.

1
0
dj képe

ha az kevésbé terheli a rendszert, jó hogy ennyien vagyunk.

0
0

Üdv!
Dudás József

Dean képe

Szóval a hook_node_access()-ben el tudom kapni a termékhez rendelt node-ot is, így annak azt a mezőjét is, amelyikben a lejárati időintervallumot tárolom.
Az order history-ban megtalálom azt a részt, amikor az order státusza teljesítettbe került. Ezzel az időbélyeggel és a külön node-ban (vagy taxonomyban) tárolt intervall filed-del együtt megvan a lejárati idő.
Ha a lejárati időn belül van, akkor engedem hogy lássa, ha meg nem, akkor a szerepkör alapján engedem hogy eldőljön a szokásos módon.

Jól értem?

Elsőre világosnak tűnik, remélem a kivitelezés is majd az lesz. :)

Köszi mindenkinek a help-et!

0
0
nevergone képe

„Tudtommal a Drupal rendszer annak eldöntésére, hogy egy tartalmat egy adott user számára megjeleníthet-e vagy sem elsősorban a szerepköröket használja.”

Elsősorban lehet, de messze nem csak azt, számtalan hozzáférés-jogosultság kezelő modul létezik. Első körben azt ajánlanám, hogy gondold végig: mit szeretnél pontosan. Utána pedig azt, hogy hogyan. Nekem legalábbis nem érthető, hogy pontosan mit szeretnél, de lehetséges, hogy egyedi fejlesztés kell hozzá. Ezt viszont már nem a Drupal core-ban, hanem egy saját külső modulban célszerű megtenned.

Ui.: http://drupal.hu/node/5450/

0
0
Dean képe

Köszönöm az észrevételeket, akkor pontosítanék:

Gyakorlatilag azt szeretném megvalósítani, hogy a Commerce-ben történő vásárlásnál ne szerepkört vásároljon a user.
Sok termék van, ezért így sok szerepkör lenne szükséges, ami amellett hogy telezsúfolná (szerintem feleslegesen) a szerepkör részt még elég nehezen is áttekinthető.

Hogyan is fogalmazzam meg?
Az áruházban veszek "valamit" (node, taxonomy, bármilyen Drupal által kezelt entitás) és ez a valami biztosítja nekem azt, hogy a tartalmak egy csoportját megtekinthessem.
Sokan ezt szerepkörrel állítják be, mert van max 2-3 termék és slusz.
Felveszik ezt a 2-3 szerepkört és készen is vannak.

No de szerepkör nélkül?
A tartalmak, amelyeknek a megtekintési jogát megvettem összetett, node reference-el egymásba ágyazott tartalmak egy csoportja.
Tehát nem egyetlen egy "Hello World!" egyszerű page oldal megtekintésének a jogáról van szó, hanem egy termék esetén kb. 2-300 oktató oldal megtekintésének a jogát vettem meg.
Ennek a 2-300 oldalnak a megjelenítése a szokásos szerepkör jogosultság mellett (admin láthatja) egy web áruház vásárláshoz kötött joghoz kéne kötődjön.

Ezért vetettem fel azt, hogy szimulálnám a szerepköröket egy tartalom típussal. Mintha csak azt mondanám, hogy ezeket az oldalakat láthatod ha:
Benne vagy egy bizonyos szerepkörben (pl admin)
VAGY
Birtokolsz egy külön node-ot (Szerepköröket szimuláló tartalom típus).

Ha e 2 feltétel valamelyike teljesül, akkor nem lesz access denied. :)

Olyan, mintha a szerepköröket "kibővíteném" node-okkal.

0
0
wouhn képe

Egyébként nem hülyeség, amit mondasz. Tegyük fel, hogy a webshopban megvásárolsz egy node-ot. A sikeres vásárlás automatikusan hozzárendeli a vevőt az adott node entity reference mezőjéhez. Innentől már van kapcsolat a node és a vásárló között, amely akár a másik drupalodban is meg tud jelenni, mivel írtad máshol, hogy két rendszerben gondolkodsz. Csak ugye ott van a bibi, hogy ha jól értem a dolgot, akkor egy node vásárlásával több node is elérhetővé kell, hogy váljon a vásárló számára. Akkor viszont a node vásárlásánál jobb, ha taxonómiát vásárol az illető és ezzel együtt jogot formál minden olyan tartalomra, amely az adott taxonómiával rendelkezik.

Aztán persze ott van a kérdés, amiről nem esett szó, hogy elévülnek-e ezek a jogok? Ha nem, akkor tiszta sor. Ha igen, akkor hogy lehetne ezt a legjobban automatizálni? Minden jog elvész vagy csak néhány abból a sokból, amit említettél?

Egyébként csatlakozok ahhoz, aki azt mondja, hogy nagyon szépen, alaposan végig kell gondolni egy ilyen rendszert minden buktatójával és a későbbiekben előforduló hülyeségével együtt.

Bocsi, hogy sokat nem segítettem, inkább csak vaktába ötleteltem, de amit eddig leírtál szerintem megvalósítható a dolog alaprendszer belenyúlkálás nélkül. Saját modul írásától viszont Isten sem véd meg egy idő után :)

0
0
Dean képe

Igen, van még az elévülés.

Leírom akkor, hogy most egy régi de működő D6-os Übercartos rendszerben (ezt cserélnénk le D7 Commerce-re) rendszerben kb 560 szerepkörrel van megoldva.
A PHP memory limit fel is van nyomva 512M-re, különben összeomlana a sima jogosultság megjelenítő oldal, ahol így több mint 90,000 checkboxot kéne kirakjon.
Azt a rendszert nem én csináltam, de hacsak lehet ezt a hibát nem követném el.

Az egyszerűség kedvéért vannak a tankönyvek és a leckék, és legyen mondjuk egy könyvnek 10 leckéje amelyek külön is megvásárolhatóak:
Tankönyv 1 - 1 hónapra
Tankönyv 1 - 1. Lecke - 1 hónapra
Tankönyv 1 - 2. Lecke - 1 hónapra
Tankönyv 1 - 3. Lecke - 1 hónapra
...
Tankönyv 1 - 10. Lecke - 1 hónapra
Tankönyv 2 - 1 hónapra
Tankönyv 2 - 1. Lecke - 1 hónapra
Tankönyv 2 - 2. Lecke - 1 hónapra
Tankönyv 2 - 3. Lecke - 1 hónapra
...
Tankönyv 2 - 10. Lecke - 1 hónapra

És ez szorozva a 3 hónapos és 1 éves verziókkal.

Ha csak 10 könyv lenne, akkor csak összesen 10 X 10 = 100 lecke lenne
Ha csak 3 időszak lenne, akkor ez testvérek között is 3 X 100 = 300 szerepkör lenne. (Ja plusz a teljes könyvek szerepkörei)

Ti próbáltatok már egy olyan oldal jogosultság részére bemenni, ahol több mint 500 szerepkör van?
Én igen, és köszönöm de never more.
A legapróbb jog kezelés is idegőrlő és épp csak össze nem omlik az oldal, de az is csak azért nem mert olyan vas van alatta.

Szóval ha lenne megoldás a szerepkörök kiváltására, akkor az intervall field mezők alkalmazásával (akár a taxonomyban) már le lehet programozni hogy a cronban egy user az idő lejártával egy ilyen entitást "elveszítsen". A legnagyobb kérdésem tehát az, hogy szerintetek egy entitást lehet-e használni megtekintési jogra?

0
0
szt képe

Ez talán nem pont a válasz, de szerintem idevág, vagy ötletet adhat, szóval node jogosultság eladása commerce-szel:
http://commerceguys.com/blog/selling-node-access-drupal-commerce

0
0