अधिक विकल्प कैसे वर्तमान में लॉग उपयोगकर्ता का केवल डेटा प्रदर्शित करने के हैं।
यदि आप एसीएल का उपयोग नहीं करना चाहते हैं, तो आप SQL क्वेरी (डीक्यूएल क्वेरी) में कुछ शर्त जोड़कर डिफ़ॉल्ट क्वेरी बदल सकते हैं, उदाहरण के लिए 'जहां व्यवस्थापक आईडी = 5'। यह अधिक काम करेगा, लेकिन मैं आपको मूल उदाहरण दिखाऊंगा, इसे कैसे करें।
नए सेटर सेट सेक्योरिटी कॉन्टेक्स्ट जोड़कर services.xml में अपनी व्यवस्थापक सेवाओं की अपनी परिभाषा बदलें। मैं कुछ उत्पादों को सूचीबद्ध और संपादित करने के लिए व्यवस्थापक का उपयोग करूंगा।
<service id="acme_demo_admin.product" class="Acme\Bundle\DemoAdminBundle\Admin\ProductAdmin">
<tag name="sonata.admin" manager_type="orm" group="product_group" label_catalogue="admin" label="Products"/>
<argument />
<argument>Acme\Bundle\DemoAdminBundle\Entity\Product</argument>
<argument>AcmeDemoAdminBundle:ProductAdmin</argument>
<call method="setSecurityContext">
<argument type="service" id="security.context" />
</call>
</service>
SecurityContext सेवा, कि वर्तमान में लॉग उपयोगकर्ता के बारे में जानकारियां शामिल हैं।
एक्मे/बंडल/DemoAdminBundle/व्यवस्थापक/ProductAdmin.php में सेटर setSecurityContext जोड़ सकते हैं और createQuery पद्धति को बदलने:
<?php
namespace Acme\Bundle\DemoAdminBundle\Admin;
use Symfony\Component\Security\Core\SecurityContextInterface;
// ...
class ProductAdmin extends Admin
{
/**
* Security Context
* @var \Symfony\Component\Security\Core\SecurityContextInterface
*/
protected $securityContext;
public function setSecurityContext(SecurityContextInterface $securityContext)
{
$this->securityContext = $securityContext;
}
protected function configureRoutes(RouteCollection $collection)
{
//remove all routes except those, you are using in admin and you can secure by yourself
$collection
->clearExcept(array(
'list',
'edit',
))
;
}
public function createQuery($context = 'list')
{
$queryBuilder = $this->getModelManager()->getEntityManager($this->getClass())->createQueryBuilder();
//if is logged admin, show all data
if ($this->securityContext->isGranted('ROLE_ADMIN')) {
$queryBuilder->select('p')
->from($this->getClass(), 'p')
;
} else {
//for other users, show only data, which belongs to them
$adminId = $this->securityContext->getToken()->getUser()->getAdminId();
$queryBuilder->select('p')
->from($this->getClass(), 'p')
->where('p.adminId=:adminId')
->setParameter('adminId', $adminId, Type::INTEGER)
;
}
$proxyQuery = new ProxyQuery($queryBuilder);
return $proxyQuery;
}
//... configureListFields, configureDatagridFilters etc.
}
भूमिका SONATA_ADMIN बिना उपयोगकर्ता सभी रिकॉर्ड नहीं देख सकता।
दूसरा चरण - कुछ विशेष मार्ग सुरक्षित करें, exmaple संपादित करें - आपको यह जांचना चाहिए कि वर्तमान में व्यवस्थापक व्यवस्थापक निर्दिष्ट उत्पाद को संपादित कर सकता है या नहीं।
आप अपने own security voter (पसंद समाधान) बना सकते हैं या कस्टम CRUD नियंत्रक का उपयोग करें।
कस्टम CRUD नियंत्रक में: एक्मे/बंडल/DemoAdminBundle/नियंत्रक/ProductController.php editAction ओवरलोड ।
<?php
namespace Acme\Bundle\DemoAdminBundle\Controller;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class ProductAdminController extends Controller
{
public function editAction($id = null)
{
$request = $this->getRequest();
$id = $request->get($this->admin->getIdParameter());
$securityContext = $this->get('security.context');
if (!$securityContext->isGranted('ROLE_ADMIN')) {
$adminId = $securityContext->getToken()->getUser()->getId();
$accessGranted = //here you should check if user with adminId can edit product with $id
if (!$accessGranted) {
throw new AccessDeniedException(sprintf('Admin ID %s has no access to product with id %s', $adminId, $id));
}
}
return parent::editAction($id);
}
}
जैसा कि आप देख सकते हैं, आप किसी भी कार्यक्षमता को जोड़ने के लिए कई विधियों और मार्गों को अधिभारित कर सकते हैं। लेकिन जैसा कि मैंने पहले कहा था, यह अधिक काम है, इसलिए विधियों को अधिभारित करने के बजाय, पहले जांच करें कि सिम्फनी की एसीएल (या सिर्फ अपना सुरक्षा मतदाता बनाना) आपको अपनी परियोजना में क्या चाहिए या नहीं।
शायद पहुँच हासिल करने के लिए यह होगा के साथ एक [मतदाता] बेहतर (http://symfony.com/doc/master/cookbook/security/voters.html)। वास्तव में –
। मैंने जवाब अपडेट किया है। धन्यवाद। – pulzarraider