Ik ben een beetje aan het experminteren met ACL's (Access Control List). Ik heb dit principe wel door en zie daar alle voordelen in. Ik snap dat je mensen kunt restricten op bepaalde zaken, maar hoe geef je dit door aan bijvoorbeeld de template parser.

Voorbeeldje:

Je kunt hier op PHPhulp je posts editten. Hoe zorg ik ervoor (via OOP en smarty) dat het edit icoon (op een eenvoudige manier) alleen bij de juiste user wordt getoond?
Gewoon een functie aanroepen? In de functie kijk je of de edit knop getoond mag worden of niet.
Dat snap ik, maar hoe geef ik dit door aan mijn templateparser zodat deze alleen wordt getoond bij de juiste post.

En hoe zit het met bijv posts editten.
Een post is een post. of die nu gemaakt is door jou, of door mij maakt volgens het systeem niet uit. Maar hoe maak ik dan een rol aan zodat je alleen je eigen posts kan bewerken en niet van andere. Ik kan dit wel simpel bouwen natuurlijk maar ik wil het in de gedachten van OOP doen i.c.m. met Smarty en ACL om rollen en rechten te geven.
Ik kan je hier denk ik niet verder mee helpen. Als ik kijk naar bestaande applicaties wordt er gewoon de functie aangeroepen

show_edit();

functie show_edit zou er dan zo uitzien


<?php
    function show_edit(){
        //kijk of het topic id overeen komt van het user id
        //selecteer rechten aan de hand van het user id
        
        //als één van de twee true geeft dan return je de boel, anders niks.
    }
?>


Ik kan er helaas niet meer van maken...
iets als
<?php

$smarty->assign('edit_knop',$acl->isAllowed($user,'topic_edit'));

?>

en dan natuurlijk met smarty nog een {if $edit_knop}...


Ja, in PHP zou ik dan zoiets doen:

<?php

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if($acl->isAllowed($_SESSION['userid', 'edit_topic') && $_SESSION['userid'] == $post->getOwner())
{
//doe hier de wijzigingen
$smarty->assign('editbutton', '<a href="edit.php?messageid='.$_GET['id'].'"><img src="images/edit.png" /></a>');
}
else
{
$smarty->assign('message', 'U heeft geen rechten om dit topic te wijzigen.');
}
}

?>

Is dit een beetje een verstandige zaak van werken?

Uiteraard zou dan $_GET nog gecontroleerd moeten worden, maar dat is aan de DB class (ik gebruik PDO meestal).
Kan je niet direct vanuit smarty die ACL laag aanspreken? Ik gebruik zelf eigenlijk altijd PHP als template-taal, en dan is het gewoon

<?php if($acl->user_may('edit', $post)):?>
<a href="edit.php">bewerk mij</a>
<?php endif ?>

Ergens in de ACL laag moet je dan controleren of de op dit moment ingelogde user ook de eigenaar van de $post is, of een admin.

Ik neem aan dat Smarty ook wel zoiets dergelijks mogelijk maakt.
Je zou in je template een ifstatement kunnen zetten bijv

{ if $edit}
// hier je HTMl voor de edit button
{/if}

en dan een variable meegeven die de output van je isAllowed functie heeft.
Op die manier wordt je template wel weer volgestampt met allerlei php if statements. Wanneer je alleen een functie aanroept (het is indd wel een extra functie maar dat zal toch niet zo veel uitmaken?) dan hou je je template wel schoner...
Op de manier van thijs heb je wel het voordeel dat de designer de button kan aanpassen.
Nouja, ik denk dat ik de manier van Thijs gebruik. Uiteraard de Smartyfunctie {if}. En dan gewoon een variabelen setten als de gebruiker geauthoriseerd is. Als hij dat niet is, de variabelen niet setten.

Reageren