Jogosultsági kérdés (kódban)

opera11 képe

Üdv, lenne egy jogosultságokkal kapcsolatos kérdésem, egy picit bővebben leírnám a nyűgömet, a konkrét kérdést alul tettem fel, ami remélhetőleg önmagában, a sok duma nélkül is érthető.

A főszereplők:

  • Drupal 6 (helyi gépen, nincs
  • modr8 - Tartalmakat moderáló modul, egy oldalon listázza azokat a nodokat, amiknél a közzétételi beállításoknál szerepel az, hogy "moderálási soban áll".
  • Taxonomy Access Control Lite - A megtekintési, frissítési és törlési jogok szabályozása taxonomy alapján, csoportoknak (be nem jelentkezett látogató, azonosított felhasználó, moderátorok), de akár egyéni felhasználóként is. Tehát beállítható, hogy pityu csak az "autó" taxonomiával rendelkező nodokat tudja megtekinteni és/vagy szerkeszteni és/vagy törölni, géza pedig csak a "kerékpár" kategóriába érkező nodokat.

Mit szeretnék elérni?

A fenti két modult közelebbi kapcsolatba hozni egymással :D Azt szeretném, hogy pityu csak az "autó" taxonomiával rendelkező nodokat tudja moderálni, szerkeszteni, törölni, géza pedig csak a "kerékpár" kategóriába érkező nodokat.

Mi a gondom?

A modr8 jogosultságánál csak azt lehet állítani, hogy az adott felhasználó csoportnak (moderátorok, azaz pityu és géza) van-e joga moderálni, azaz a user_access('administer nodes') teljesül-e. Ezt a jogot pedig minden moderátor megkapja, ergo bármelyik moderátor, bármelyik taxonomiába érkező nodeot tudja moderálni, amit elszeretnék kerülni.

A Taxonomy Access Control Lite úgy jön a képbe, hogy felhasználóként kiadom, hogy pityunak van joga az "autó" taxonomiával rendelkező nodokat szerkeszteni és törölni.

Ennek az az eredménye, hogy a modr8 moderáló modulban az "autó" taxonomiás nodokat pityu moderálhatja, törölheti, szerkesztheti, ami jó is, viszont minden más taxonomiába érkező, moderálandó tartalmat lát és moderálhat is, amit el szeretnék kerülni.

Mire használnám? Felhasználási terület.

Egy Startlap szerű oldal létrehozása miatt lenne szükség a funkcióra, ahol a lap.hu-k tulajdonképpen speciális taxonomia oldalak és minden taxonomiának külön moderátora lenne.

Vakvágányok

A drupal.orgon a modr8 modulnál volt egy ilyen kérdés, ahol az említett Taxonomy Access Control Lite modult javasolták, valamint azt, hogy a megtekintési joggal játszunk. Sajnos ez nem járható út, mert akkor a moderátorok más oldalból nem látnak semmit, de ami még ennél is rosszabb, hogy az azonosított felhasználóknak is eltűnik az oldal, mert ugyebár a moderátor egyszerre azonosított felhasználó is, ergo az azonosított felhasználóktól is meg kell vonni a megtekintési jogot.

A Drupal.hu-n is találtam pár, tágan véve hasonló kérdést, de sokra nem mentem vele sajnos, főleg mert valaki a multi-site irányába ment, vagy szeretett volna menni, de szerintem így valamivel egyszerűbb, de azért valamibe bele kell nyúlni valamiba.

Hogyan kezdtem megoldani, gondolkodni, közelítés a kód fele

Ha jól gondolom, akkor a modr8, moderálandó tartalmakat listázó oldalán kellene egy plusz szűkítési feltetelt beépíteni, hogy csak azokat a tartalmakat listázza ki, amire az adott felhasználónak van törlési joga. A modr8.module idevágó része:

$items['admin/content/modr8'] = array(
    'title' => 'Moderated content',
    'description' => 'Approve or delete moderated content.',
    'access callback' => 'user_access',
    'access arguments' => array('moderate content'),
    'page callback' => 'modr8_page',
    'file' => 'modr8_admin.inc',
  );

Ebből számomra az derül ki, hogy a admin/content/modr8 oldal megtekintéshez kell a 'moderate content' nevű felhasználó jogosultság (user_access) kell, tehát a plusz szűkítési feltételt (van-e törlési joga a felhasználónak) nem ide kell írni, viszont a 'modr8_admin.inc' fájl, 'modr8_page' függvénye már érdekes lehet.

Tehát akkor a modr8_admin.inc fájl idevágó része:

function modr8_page() {
 
  $is_published = '';
  if (!user_access('administer nodes')) {
    // Users who don't have the 'administer nodes' permission can only see published nodes.
    $is_published = 'n.status = 1 AND ';
  }
  $count_sql = db_rewrite_sql('SELECT COUNT(*) FROM {node} n WHERE '. $is_published .' n.moderate = 1');
  $page_sql = db_rewrite_sql('SELECT n.nid FROM {node} n WHERE '. $is_published .' n.moderate = 1 ORDER BY n.changed DESC');
  $result = pager_query($page_sql, 10, 0, $count_sql);
  $result_count = pager_query($page_sql, 10, 0, $count_sql);
  $output = '<p>'. l(t('Show log of all actions on moderated content.'), 'admin/reports/modr8') .'</p>';
 
 
  if (db_fetch_object($result_count)) {
    $output .= drupal_get_form('modr8_form', $result);
    $output .= theme('pager');
 
  }
  else {
    $output .= '<p>'. t('@items in moderation', array('@items' => format_plural(0, '1 post', '@count posts'))) .'</p>';
  }
  return $output;
}

Ha jól tudom, akkor Drupalban user és node alapú jogosultság kezelés van és jelen esetben node alapú szűrést kell beépíteni, (ha minden igaz) ehhez még a jogosultságnak a nevét kell tudni.

A Taxonomy Access Control Lite modulban, amikor kiadom a jogosultságokat, akkor ilyenek vannak: "This scheme includes permissions grant_view and grant_update and grant_delete", ezt persze annál az összeállításnál írja ki, ahol megvan mind a 3 jogunk. Ezek szerint a grant_delete jogosultságot kell ellenőrizni?

Sejtésem, konkrét kérdésem

Tehát ha azt szeretném elérni, hogy a modr8 modul csak azokat a moderálandó tartalmakat listázza, amiknél az adott moderátor rendelkezik a grant_delete nevű, node_access típusú jogosultsággal, akkor ez a kód értelmes, jó?

node_access('grant_delete')

És ha igen, akkor hogyan kell a fent bemásolt, modr8_admin.inc fájlba belepaszírozni?

Az ötleteket, tippeket, segítséget, de a probléma végig olvasását is előre köszönöm, mert eléggé elakadtam

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
Tgr képe

Nyilván nem értelmes. Még ha működne is a node_access('grant_delete') (nem fog, mint azt a node_access dokumentációban ellenőrizheted), akkor is egy igaz vagy hamis értéket adna vissza, és attól függően használhatnád vagy sem a moderáló oldalt. Nyilván nem szűrné meg tőle mágikus módon a kód későbbi részében generált listát. (A helyes alak egyébként node_access('delete', $node), de csak akkor értelmes, ha van egy konkrét node-od.)

0
0
Tgr képe

A legjárhatóbb megoldásnak még az tűnik, ha lekéred a user által kezelt kategóriák listáját a TAC Lite _tac_lite_user_tids(&$account, $scheme) függvényével, és arra rászűrsz az SQL lekérdezésben (a tac_lite_db_rewrite_sql()-ből ki lehet nézni a kódot). Ha nem akarod átírni a TAC Lite forrását (általában nem illik más modul kódját módosítani), és nem ijedsz meg saját modul írásától, akkor kiszervezheted egy hook_db_rewrite_sql hívásba is.

0
0
opera11 képe

elkezdem megemészteni :)

0
0
Tgr képe

A vége helyesen úgy lenne, hogy ha nem akarod átírni a modr8 forrását.

0
0