আমি নিম্নলিখিত স্কিম ব্যবহার করি। বলা বাহুল্য যে বেশিরভাগ ব্যবহারকারীর অনুমতি চেক দুটি সাধারণ ক্ষেত্রে বিভক্ত করা যায়:
- প্যারামিটারগুলির ক্রিয়াটি পরীক্ষা না করে ব্যবহারকারীর ভূমিকার ভিত্তিতে নিয়ন্ত্রক ক্রিয়ায় ব্যবহারকারী অ্যাক্সেস ডেকে আনা হয়,
- নির্দিষ্ট ব্যবহারকারী এবং নির্দিষ্ট মডেলের মধ্যে কোনও যুক্তি বা সম্পর্কের ভিত্তিতে মডেলটিতে ব্যবহারকারী অ্যাক্সেস।
বৈশিষ্ট্যগুলি পরীক্ষা না করে নিয়ামক অ্যাক্সেস অ্যাক্সেস সাধারণত এমভিসি ফ্রেমওয়ার্কগুলিতে প্রয়োগ করা হয়। এটি মোটেই সহজ: আপনি বিধিগুলি সংজ্ঞায়িত করেন, আপনার ব্যবহারকারীর ভূমিকা রয়েছে। আপনি সহজেই পরীক্ষা করে দেখুন যে ব্যবহারকারীর বিধিগুলিতে এর ভূমিকাটি অনুসন্ধান করার অনুমতি রয়েছে।
নির্দিষ্ট মডেলটিতে ব্যবহারকারীর অ্যাক্সেসকে মডেলে সংজ্ঞায়িত করা উচিত। (অভিনেতা বেস ব্যবহারকারী শ্রেণি। ধরুন এটি গ্রাহক, বিক্রেতা বা অতিথি হতে পারে))
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);
}
}
আপনি যখন নিজের মেনুগুলি তৈরি করেন এবং কোনও লিঙ্ক প্রদর্শন করবেন কিনা তা স্থির করে আপনি সোমারকন্ট্রোলার :: চেকমোডেলএ্যাক্সেস ($ আইডি) পদ্ধতিতে কল করতে পারেন।