এসিএল এবং নিয়ন্ত্রণকারীরা
প্রথমত: এগুলি প্রায়শই বিভিন্ন জিনিস / স্তর। আপনি উদাহরণস্বরূপ নিয়ামক কোডের সমালোচনা করার সময় এটি উভয়কে একসাথে রাখে - সম্ভবত স্পষ্টতই খুব শক্ত tight
তেরেকো ইতিমধ্যে একটি উপায়ে রূপরেখা তৈরি করেছেন যাতে আপনি কীভাবে ডেকরেটারের ধরণ দিয়ে এটি আরও ডিকুবল করতে পারেন ple
আপনি যে মূল সমস্যার মুখোমুখি হচ্ছেন তা সন্ধান করতে আমি প্রথমে এক ধাপ পিছনে যাব এবং তার পরে কিছুটা আলোচনা করব।
একদিকে আপনি এমন কন্ট্রোলার রাখতে চান যে তারা যে কাজটি করতে আদেশ করেছে কেবল তা করতে পারে (কমান্ড বা ক্রিয়া, আসুন আমরা এটিকে আদেশ বলি)।
অন্যদিকে আপনি নিজের অ্যাপ্লিকেশনটিতে এসিএল রাখতে সক্ষম হতে চান। আপনার অ্যাপ্লিকেশনগুলির নির্দিষ্ট আদেশগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করতে - এই এসিএলগুলির কাজের ক্ষেত্রটি হওয়া উচিত - যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি।
এই ধরণের অ্যাক্সেস নিয়ন্ত্রণের জন্য অন্য কিছু দরকার যা এই দুটিকে একসাথে নিয়ে আসে। কোন কমান্ড কার্যকর করা হয় সেই প্রসঙ্গে ভিত্তিতে এসিএল কিক ইন করে এবং কোনও নির্দিষ্ট বিষয় (যেমন ব্যবহারকারী) দ্বারা একটি নির্দিষ্ট কমান্ড কার্যকর করা যায় কি না সে বিষয়ে সিদ্ধান্ত নেওয়া দরকার।
আমাদের কী আছে এই পয়েন্টটি সংক্ষেপে বলা যাক:
এসিএল উপাদানটি এখানে কেন্দ্রীয়: কমান্ডটি সম্পর্কে কমপক্ষে কিছু জানতে হবে (কমান্ডটি সুনির্দিষ্ট হওয়ার জন্য চিহ্নিত করতে) এবং এটির জন্য ব্যবহারকারীকে সনাক্ত করতে সক্ষম হওয়া দরকার। ব্যবহারকারীরা সাধারণত একটি অনন্য আইডি দ্বারা সহজেই সনাক্ত করা যায়। তবে প্রায়শই ওয়েব অ্যাপ্লিকেশনগুলিতে এমন ব্যবহারকারী রয়েছে যা একেবারেই চিহ্নিত করা যায় না, প্রায়শই অতিথি, বেনামে, সবাই বলা হয় For উদাহরণস্বরূপ আমরা ধরে নিই যে এসিএল একটি ব্যবহারকারী অবজেক্ট গ্রাস করতে পারে এবং এই বিবরণগুলি সরিয়ে ফেলতে পারে। ব্যবহারকারী বস্তু অ্যাপ্লিকেশন অনুরোধ বস্তুর সাথে আবদ্ধ এবং এসিএল এটি গ্রাস করতে পারে।
একটি কমান্ড সনাক্তকরণ সম্পর্কে কি? এমভিসি প্যাটার্নটির আপনার ব্যাখ্যা থেকে বোঝা যায় যে একটি আদেশ একটি শ্রেণিকাম এবং একটি পদ্ধতির নামের মিশ্রণ। যদি আমরা আরও নিবিড়ভাবে লক্ষ্য করি তবে কমান্ডের জন্য এমনকি যুক্তি (পরামিতি )ও রয়েছে। সুতরাং এটি জিজ্ঞাসা বৈধ যে ঠিক কোন আদেশটি চিহ্নিত করে? শ্রেণীর নাম, পদ্ধতি নাম, আর্গুমেন্টের সংখ্যা বা নাম, এমনকি কোনও যুক্তির ভিতরে থাকা ডেটা বা এই সমস্তটির মিশ্রণ?
আপনার এসিএলিংয়ে একটি কমান্ড সনাক্ত করার জন্য আপনার কোন স্তরের বিশদের উপর নির্ভর করে, এটি অনেক আলাদা হতে পারে। উদাহরণস্বরূপ আসুন এটি সহজভাবে রাখুন এবং নির্দিষ্ট করুন যে কোনও আদেশ একটি শ্রেণীর নাম এবং পদ্ধতির নাম দ্বারা চিহ্নিত করা হয়েছে।
সুতরাং কীভাবে এই তিনটি অংশ (এসিএল, কমান্ড এবং ব্যবহারকারী) একে অপরের অন্তর্গত তা এখন আরও স্পষ্ট।
আমরা বলতে পারি, একটি কাল্পনিক এসিএল সঙ্গতি সহ আমরা ইতিমধ্যে নিম্নলিখিতগুলি করতে পারি:
$acl->commandAllowedForUser($command, $user);
এখানে কী ঘটছে তা দেখুন: কমান্ড এবং ব্যবহারকারী উভয়কেই চিহ্নিতযোগ্য করে দিয়ে, এসিএল এটি কাজ করতে পারে। এসিএলের কাজটি ব্যবহারকারী অবজেক্ট এবং কংক্রিট কমান্ড উভয়ের কাজের সাথে সম্পর্কিত নয়।
এখানে কেবল একটি অংশ নেই, এটি বাতাসে থাকতে পারে না। এবং এটা না। সুতরাং অ্যাক্সেস কন্ট্রোলটিতে যে জায়গাটি কিক করতে হবে সেই জায়গাটি আপনাকে খুঁজে বের করতে হবে Let's স্ট্যান্ডার্ড ওয়েব অ্যাপ্লিকেশনটিতে কী ঘটে তা একবার দেখে নেওয়া যাক:
User -> Browser -> Request (HTTP)
-> Request (Command) -> Action (Command) -> Response (Command)
-> Response(HTTP) -> Browser -> User
সেই জায়গাটি সনাক্ত করতে, আমরা জানি কংক্রিট কমান্ড কার্যকর হওয়ার আগে এটি অবশ্যই হওয়া উচিত, সুতরাং আমরা সেই তালিকাটি হ্রাস করতে পারি এবং কেবলমাত্র নিম্নলিখিত (সম্ভাব্য) স্থানগুলি অনুসন্ধান করা দরকার:
User -> Browser -> Request (HTTP)
-> Request (Command)
আপনার আবেদনের এক পর্যায়ে আপনি জানেন যে কোনও নির্দিষ্ট ব্যবহারকারী একটি কংক্রিট কমান্ড সম্পাদনের জন্য অনুরোধ করেছেন। আপনি ইতিমধ্যে এখানে কিছু ধরণের ACL'ing করছেন: কোনও ব্যবহারকারী যদি কোনও কমান্ডের অনুরোধ করে যা বিদ্যমান নেই, আপনি সেই আদেশটি কার্যকর করতে অনুমতি দেবেন না। সুতরাং আপনার অ্যাপ্লিকেশনটিতে যেখানে কখনও ঘটে তা হ'ল "আসল" এসিএল চেক যুক্ত করার জন্য ভাল জায়গা হতে পারে:
কমান্ডটি অবস্থিত হয়েছে এবং আমরা এটির সনাক্তকরণ তৈরি করতে পারি যাতে এসিএল এটির সাথে ডিল করতে পারে। কমান্ডটি ব্যবহারকারীর জন্য অনুমোদিত না হলে, কমান্ডটি কার্যকর করা হবে না (ক্রিয়া)। সম্ভবত মামলার CommandNotAllowedResponse
পরিবর্তে CommandNotFoundResponse
কোনও অনুরোধ একটি কংক্রিট কমান্ডের মাধ্যমে সমাধান করা যায় নি।
কংক্রিটের HTTPRequest এর ম্যাপিং যে স্থানে একটি কমান্ডের সাথে ম্যাপ করা হয় তাকে রাউটিং বলা হয় । যেহেতু রাউটিংয়ের ইতিমধ্যে কোনও কমান্ড সনাক্ত করার কাজ রয়েছে, সুতরাং কেন কমান্ডটি আসলে এসিএল অনুসারে অনুমোদিত? ব্যাপ্ত দ্বারা যেমন Router
একটি ACL এর সচেতন রাউটারে: RouterACL
। যদি আপনার রাউটারটি এখনও জানে না User
, তবে এটি Router
সঠিক জায়গা নয়, কারণ এসিএল'র জন্য কেবল কমান্ডটিই ব্যবহার করা যায় না তবে ব্যবহারকারীকেও সনাক্ত করতে হবে। সুতরাং এই জায়গাটি পরিবর্তিত হতে পারে তবে আমি নিশ্চিত যে আপনি যে স্থানটি প্রসারিত করতে হবে তা আপনি সহজেই সনাক্ত করতে পারেন, কারণ এটি সেই জায়গা যা ব্যবহারকারী এবং কমান্ডের প্রয়োজনীয়তা পূরণ করে:
User -> Browser -> Request (HTTP)
-> Request (Command)
ব্যবহারকারী প্রথম থেকেই উপলব্ধ, কমান্ড প্রথম দিয়ে Request(Command)
।
সুতরাং প্রতিটি কমান্ডের কংক্রিট বাস্তবায়নের ভিতরে আপনার এসিএল চেকগুলি রাখার পরিবর্তে আপনি এটির আগে এটি স্থাপন করুন। আপনার কোনও ভারী নিদর্শন, যাদু বা যা কিছু প্রয়োজন নেই, এসিএল এটি কাজ করে, ব্যবহারকারী এটি কাজ করে এবং বিশেষত কমান্ড এটি কাজ করে: কেবল কমান্ড, অন্য কিছুই নয়। কমান্ডটি কোনও জায়গায় রক্ষিত আছে কি না সে ক্ষেত্রে ভূমিকাগুলি প্রয়োগ হয় কি না তা জানার আগ্রহ নেই।
সুতরাং কেবল একে অপরের অন্তর্ভুক্ত নয় এমন জিনিসগুলি আলাদা রাখুন। একক দায়িত্বের নীতি (এসআরপি) এর সামান্য পুনর্নির্মাণ ব্যবহার করুন : কমান্ড পরিবর্তন করার জন্য কেবল একটি কারণ থাকতে হবে - কারণ আদেশটি পরিবর্তিত হয়েছে। আপনি এখন আপনার অ্যাপ্লিকেশনটিতে ACL'ing চালু করার কারণে নয়। আপনি ব্যবহারকারীর বস্তু স্যুইচ করার কারণে নয়। আপনি এইচটিটিপি / এইচটিএমএল ইন্টারফেস থেকে একটি এসওএপি বা কমান্ড-লাইন ইন্টারফেসে স্থানান্তরিত করার কারণে নয়।
আপনার ক্ষেত্রে ACL একটি কমান্ড অ্যাক্সেসকে নিয়ন্ত্রণ করে, কমান্ডটি নিজেই নয় not
if($user->hasFriend($other_user) || $other_user->profileIsPublic()) $other_user->renderProfile()
(অন্যথায়, "আপনার এই ব্যবহারকারীর প্রোফাইলে অ্যাক্সেস নেই" বা এর মতো কিছু প্রদর্শন করুন? আমি তা পাই না