<?php
namespace ForumBundle\Security;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use CoreBundle\Entity\Category;
use CoreBundle\Entity\Tutor;
use CoreBundle\Entity\Student;
class CategoryVoter extends Voter
{
public function __construct()
{
}
protected function supports($attribute, $subject)
{
// if the attribute isn't one we support, return false
if (! in_array($attribute, array('view'))) {
return false;
}
// only vote on Post objects inside this voter
if (! $subject instanceof Category) {
return false;
}
return true;
}
/**
* Droit d'accès à une catégorie $subject
*
* {@inheritDoc}
* @see \Symfony\Component\Security\Core\Authorization\Voter\Voter::voteOnAttribute()
*/
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
$user = $token->getUser();
// les tables tutor et student n'ont pas évoluées ensemble, elles présentent pas mal de différences.
if ($user instanceof Tutor) {
// si c'est un admin, c'est réglé
if ($user->getAdmin()) {
return true;
}
// on vérifie s'il y a un droit d'accès individuel
if ($user->getCategories()->contains($subject)) {
return true;
}
} elseif ($user instanceof Student) {
if ($subject->getTutorOnly() == true) {
return false;
}
// 1er lvl on vérifie la branche
if ($subject->getLevel() == 1) {
if ($subject->getBranches()->contains($user->getBranche())) {
return true;
}
// 2ième (ou plus) level, on vérifie le secteur
} else {
foreach ($user->getStudentSecteurs() as $studentSecteur) {
if ($subject->getSecteurs()->contains($studentSecteur->getSecteur())) {
if ($subject->getParent()->getBranches()->contains($user->getBranche())) {
return true;
}
//return true;
}
}
}
}
return false;
}
}