हमने हाल ही में संगठन सुधारने, डुप्लिकेशंस को कम करने, अन्य चीजों के साथ, सिद्धांत सुधार 2.2 और ज़ेंड फ्रेमवर्क 2 के हिस्सों का उपयोग करना शुरू कर दिया है। आज, मैंने अपने नियंत्रकों और सिद्धांत संस्थाओं के मध्य मध्यस्थ के रूप में कार्य करने के लिए एक सेवा परत को लागू करने के लिए विचारों को फेंकना शुरू कर दिया।सेवा परत (सिद्धांत और जेडएफ) में डेटा एक्सेस और सुरक्षा
अभी, हमारे अधिकांश तर्क नियंत्रक में रहते हैं। इसके अलावा, हम कुछ अनुमतियों के परीक्षण के लिए एक एक्शन हेल्पर का उपयोग करते हैं; हालांकि, मैं ज़ेंड \ Di को लागू करने के बाद एक नए दृष्टिकोण के साथ आया था। मैंने इकाई-विशिष्ट सेवा मॉडल बनाना शुरू किया, जो एक EntityManager उदाहरण इंजेक्ट करने के लिए ज़ेंड \ Di का उपयोग करते हैं, और वर्तमान उपयोगकर्ता की अनुमतियां।
नियंत्रक कोड इस प्रकार है:
class Project_DeleteController extends Webjawns_Controller_Action
{
public function init()
{
$this->_initJsonContext();
}
public function indexAction()
{
$response = $this->_getAjaxResponse();
$auditId = (int) $this->_getParam('audit_id');
if (!$auditId) {
throw new DomainException('Audit ID required');
}
/* @var $auditService Service\Audit */
$auditService = $this->getDependencyInjector()->get('Service\Audit');
try {
$auditService->delete($auditId);
$response->setStatusSuccess();
} catch (Webjawns\Exception\SecurityException $e) {
$this->_noAuth();
} catch (Webjawns\Exception\Exception $e) {
$response->setStatusFailure($e->getMessage());
}
$response->sendResponse();
}
}
और हमारी सेवा परतों में से एक का एक उदाहरण। कन्स्ट्रक्टर दो मानकों को लेता है - एक EntityManager लेता है, और दूसरा एक इकाई \ UserAccess ऑब्जेक्ट - Zend \ Di द्वारा इंजेक्शन।
namespace Service;
use Webjawns\Service\Doctrine,
Webjawns\Exception;
class Audit extends AbstractService
{
public function delete($auditId)
{
// Only account admins can delete audits
if (\Webjawns_Acl::ROLE_ACCT_ADMIN != $this->getUserAccess()->getAccessRole()) {
throw new Exception\SecurityException('Only account administrators can delete audits');
}
$audit = $this->get($auditId);
if ($audit->getAuditStatus() !== \Entity\Audit::STATUS_IN_PROGRESS) {
throw new Exception\DomainException('Audits cannot be deleted once submitted for review');
}
$em = $this->getEntityManager();
$em->remove($audit);
$em->flush();
}
/**
* @param integer $auditId
* @return \Entity\Audit
*/
public function get($auditId)
{
/* @var $audit \Entity\Audit */
$audit = $this->getEntityManager()->find('Entity\Audit', $auditId);
if (null === $audit) {
throw new Exception\DomainException('Audit not found');
}
if ($audit->getAccount()->getAccountId() != $this->getUserAccess()->getAccount()->getAccountId()) {
throw new Exception\SecurityException('User and audit accounts do not match');
}
return $audit;
}
}
- इस हम क्या हासिल करने की कोशिश कर रहे हैं के लिए उपयोग करने के लिए एक उचित पैटर्न है?
- क्या पोस्ट लेयर के भीतर अनुमति परत के भीतर अनुमति सत्यापन होना अच्छा अभ्यास है?
- जैसा कि मैं इसे समझता हूं, तर्क को अभी भी नियंत्रक में रहता है, जिससे विभिन्न संदर्भों (जेएसओएन, एक्सएमएल, एचटीएमएल इत्यादि) में मॉडल लचीलापन का उपयोग किया जा सकता है। विचार?
मैं इस तरह से काम करने के तरीके से खुश हूं, लेकिन अगर कोई यह कैसे कर रहा है, तो कोई भी नकारात्मक पक्ष देखता है, तो कृपया अपने विचार पोस्ट करें।
बस मेरे दो प्रमाणीकरण पर पेंस।मुझे विश्वास नहीं है कि एक सही तरीका और गलत तरीका है, हालांकि, मैंने सेवा प्रमाणीकरण में अपना प्रमाणीकरण डालना शुरू कर दिया, लेकिन फिर इसे मेरे नियंत्रकों में स्थानांतरित कर दिया। मेरा तर्क यह था कि सेवा परत मेरी आंतरिक एपीआई है और मुझे दुनिया को बेनकाब करने के लिए अपने नियंत्रक परत का उपयोग करना चाहिए, इसलिए यह तय करना चाहिए कि किसके पास पहुंच है। अगर मैं किसी भी आंतरिक उपकरण/स्क्रिप्ट आदि बनाना चाहता हूं, तो मुझे अपनी सेवा परत का उपयोग करने के लिए उनमें प्रमाणीकरण बनाने की आवश्यकता नहीं है। –
प्रमाणीकरण और अभिगम नियंत्रण को मिश्रण न करने के लिए सावधान रहें। किसी भी डोमेन क्लास को चित्र में लाए जाने से पहले प्रमाणीकरण मॉड्यूल में जा सकता है (चाहिए?)। केवल एक बार जब आप उपयोगकर्ता पहचान स्थापित कर लेंगे। उदाहरण: अगर (! $ AuthService-> है Identity()) आपके डोमेन सेवा मॉडल के अंदर। – dualmon
@ जैमी सुथरलैंड: मैं असहमत हूं। सेवाएं व्यापार तर्क को परिभाषित करती हैं; नियंत्रक अनुरोध और उचित व्यापार तर्क के बीच पुल हैं। उदाहरण के लिए, आपके पास उत्पाद को ऑर्डर करने के लिए केवल एक ही सेवा होगी, लेकिन आपके पास HTTP अनुरोध, API अनुरोध, और बहुत कुछ के लिए एकाधिक नियंत्रक हो सकते हैं। यदि आप एसीएल से विशिष्ट अनुरोध करने के लिए चिंतित हैं (उदाहरण के लिए, HTTP के माध्यम से आप एक उपयोगकर्ता सत्र की अपेक्षा कर सकते हैं जहां आप एपीआई अनुरोधों के लिए एक गुप्त कुंजी की अपेक्षा करेंगे), इसके लिए अनुमति देने के लिए अपने एसीएल कार्यान्वयन को सामान्यीकृत करें। – moteutsch