मैं निम्नलिखित योजना का उपयोग करता हूं। यह कहने योग्य है कि अधिकांश उपयोगकर्ता अनुमतियों की जाँच को दो सामान्य मामलों में विभाजित किया जा सकता है:
- पैरामीटर कार्रवाई की जाँच किए बिना उपयोगकर्ता की भूमिका के आधार पर नियंत्रक कार्रवाई के लिए उपयोगकर्ता का उपयोग कहा जाता है,
- किसी भी तर्क या विशेष उपयोगकर्ता और विशेष मॉडल के बीच संबंधों के आधार पर उपयोगकर्ता की पहुंच।
विशेषताओं की जांच के बिना नियंत्रक कार्रवाई तक पहुंच आमतौर पर एमवीसी रूपरेखाओं में लागू की जाती है। यह बिल्कुल सरल है: आप नियमों को परिभाषित करते हैं, आपके उपयोगकर्ताओं की भूमिका है। आप बस जाँचते हैं कि उपयोगकर्ता को नियमों में अपनी भूमिका देखने की अनुमति है।
विशेष मॉडल में उपयोगकर्ता की पहुंच को मॉडल में परिभाषित किया जाना चाहिए। (अभिनेता आधार उपयोगकर्ता वर्ग है। मान लीजिए कि यह ग्राहक, विक्रेता या अतिथि हो सकता है।)
interface ICheckAccess
{
public function checkAccess(Actor $actor, $role);
}
class SomeModel implements ICheckAccess
{
public function checkAccess(Actor $actor, $role)
{
// Your permissions logic can be as sophisticated as you want.
}
}
उस तर्क को मॉडल में रखने से कुछ लाभ होता है। एक्सेस चेक विधि विरासत में मिल सकती है, आपको किसी भी अतिरिक्त कक्षाएं बनाने की आवश्यकता नहीं है, आप सामान्य ओओपी लाभों का उपयोग कर सकते हैं।
अगला, एक्सेस चेकिंग को आसान बनाने के लिए, हम कुछ अनुमान लगाते हैं जो लगभग हमेशा सादगी और अच्छी शैली के लिए लागू होते हैं:
- आमतौर पर नियंत्रक कुछ मॉडल वर्ग से संबंधित होते हैं;
- कार्रवाई जो एक्सेस के लिए जाँच की जाती है, सिंगल मॉडल आईडी को पैरामीटर के रूप में लेती है;
- इस पैरामीटर को हमेशा बेस कंट्रोलर क्लास की विधि से समान रूप से एक्सेस किया जा सकता है;
- एक्शन को मॉडल के अनुरूप कंट्रोलर में रखा जाता है जो आईडी एक्शन लेता है।
इन मान्यताओं के साथ, मॉडल आईडी का उपयोग करने वाले कार्यों को विशेष मॉडल उदाहरण के साथ जोड़ा जा सकता है। वास्तव में, अधिकांश कार्यों को आसानी से रूपांतरित किया जा सकता है और ऊपर बताई गई मान्यताओं में फिट किया जा सकता है।
फिर, कुछ आधार सार नियंत्रक वर्ग को परिभाषित और विरासत में लिया जाना चाहिए।
abstract class ModelController
{
// Retrieve model from database using id from action parameter.
public abstract function loadModel($id);
// Returns rules for user role to pass to SomeModel::checkAccess()
// Something like array('view' => 'viewer', 'delete' => 'owner', 'update' => 'owner')
public abstract function modelRules();
public abstract fucntion getIdParameter();
public function filterModelAccess()
{
$id = $this->getIdParameter();
if(!$this->checkModelAccess($id))
throw new HttpException(403);
}
public function checkModelAccess($id)
{
$model = $this->loadModel($id);
$actor = My::app()->getActor();
$rules = $this->modelRules();
$role = $rules[My::app()->getActionName()];
return $model->chechAccess($actor, $role);
}
}
जब आप अपने मेनू का निर्माण करते हैं और कुछ लिंक दिखाने का निर्णय लेते हैं, तो आप SomeController :: checkModelAccess ($ id) विधि को कॉल कर सकते हैं।