আমি কীভাবে আমার ওয়েব এমভিসি অ্যাপ্লিকেশনটিতে একটি অ্যাক্সেস নিয়ন্ত্রণ তালিকা কার্যকর করতে পারি?


96

প্রথম প্রশ্ন

দয়া করে, আপনি কী আমাকে এমভিসিতে সবচেয়ে সহজ এসিএল প্রয়োগ করা যেতে পারে তা আমাকে ব্যাখ্যা করতে পারেন।

কন্ট্রোলারে এসিএল ব্যবহারের প্রথম পদ্ধতিটি এখানে ...

<?php
class MyController extends Controller {

  public function myMethod() {        
    //It is just abstract code
    $acl = new Acl();
    $acl->setController('MyController');
    $acl->setMethod('myMethod');
    $acl->getRole();
    if (!$acl->allowed()) die("You're not allowed to do it!");
    ...    
  }

}
?>

এটি খুব খারাপ পদ্ধতির, এবং এটি বিয়োগটি হ'ল প্রতিটি কন্ট্রোলারের পদ্ধতিতে আমাদের কোডের এসিএল টুকরা যোগ করতে হয়, তবে আমাদের কোনও অতিরিক্ত নির্ভরতার প্রয়োজন নেই!

পরবর্তী পদ্ধতি হ'ল সমস্ত নিয়ামকের পদ্ধতি তৈরি করা privateএবং নিয়ামকের পদ্ধতিতে এসিএল কোড যুক্ত করা __call

<?php
class MyController extends Controller {

  private function myMethod() {
    ...
  }

  public function __call($name, $params) {
    //It is just abstract code
    $acl = new Acl();
    $acl->setController(__CLASS__);
    $acl->setMethod($name);
    $acl->getRole();
    if (!$acl->allowed()) die("You're not allowed to do it!");
    ...   
  }

}
?>

এটি আগের কোডের চেয়ে ভাল তবে মূল বিয়োগগুলি হ'ল ...

  • সমস্ত নিয়ামকের পদ্ধতি ব্যক্তিগত হওয়া উচিত
  • আমাদের প্রতিটি নিয়ামকের __call পদ্ধতিতে ACL কোড যুক্ত করতে হবে।

পরবর্তী পদ্ধতি হ'ল এসিএল কোডটি প্যারেন্ট কন্ট্রোলারে রাখা but

সমাধান কি? এবং সেরা অনুশীলন কি? পদ্ধতিটি কার্যকর করার অনুমতি বা মঞ্জুরি দেওয়ার সিদ্ধান্ত নিতে আমি কোথায় এসিএল ফাংশনগুলিতে কল করব।

দ্বিতীয় প্রশ্ন

দ্বিতীয় প্রশ্নটি এসিএল ব্যবহার করে ভূমিকা নেওয়া সম্পর্কে। আসুন কল্পনা করুন যে আমাদের অতিথি, ব্যবহারকারী এবং ব্যবহারকারীর বন্ধু রয়েছে। ব্যবহারকারী তার প্রোফাইল দেখতে অ্যাক্সেস সীমাবদ্ধ করেছে যে কেবল বন্ধুরা এটি দেখতে পারে। সমস্ত অতিথি এই ব্যবহারকারীর প্রোফাইল দেখতে পাচ্ছেন না। সুতরাং, এখানে যুক্তি ..

  • আমাদের তা নিশ্চিত করতে হবে যে নামটি বলা হচ্ছে তা প্রোফাইল is
  • আমাদের এই প্রোফাইলটির মালিক সনাক্ত করতে হবে
  • আমাদের সনাক্ত করতে হবে যে ভিউয়ার এই প্রোফাইলের মালিক বা না
  • আমাদের এই প্রোফাইল সম্পর্কে সীমাবদ্ধতার নিয়মগুলি পড়তে হবে
  • আমাদের প্রোফাইল পদ্ধতিটি কার্যকর করা বা না চালানোর সিদ্ধান্ত নিতে হবে

মূল প্রশ্নটি প্রোফাইলের মালিক সনাক্তকরণ সম্পর্কে about আমরা কে সনাক্ত করতে পারি যে কেবলমাত্র প্রোফাইলের মালিক কে মডেল এর পদ্ধতি $ মডেল-> getOwner () নির্বাহ করে, কিন্তু এসির কাছে মডেলের অ্যাক্সেস নেই। আমরা কীভাবে এটি বাস্তবায়ন করতে পারি?

আমি আশা করি আমার চিন্তাভাবনা পরিষ্কার আছে। আমার ইংরেজীর জন্য দুঃখিত.

ধন্যবাদ.


4
আমি বুঝতে পারছি না কেন ব্যবহারকারীর মিথস্ক্রিয়ার জন্য আপনার "অ্যাক্সেস নিয়ন্ত্রণ তালিকাগুলি" প্রয়োজন হবে। আপনি কি কিছু বলবেন না if($user->hasFriend($other_user) || $other_user->profileIsPublic()) $other_user->renderProfile()(অন্যথায়, "আপনার এই ব্যবহারকারীর প্রোফাইলে অ্যাক্সেস নেই" বা এর মতো কিছু প্রদর্শন করুন? আমি তা পাই না
বাটল বাটকস

4
সম্ভবত, কার্জিলা এক জায়গায় অ্যাক্সেসের জন্য সমস্ত শর্তাদি পরিচালনা করতে চায় - প্রধানত কনফিগারেশনে। সুতরাং, অনুমতিগুলিতে কোনও পরিবর্তন কোড পরিবর্তনের পরিবর্তে অ্যাডমিনে করা যেতে পারে।
মারিও

উত্তর:


185

প্রথম অংশ / উত্তর (এসিএল বাস্তবায়ন)

আমার নম্র মতে, এটির কাছে যাওয়ার সর্বোত্তম উপায়টি হ'ল ডেকরেটার প্যাটার্নটি ব্যবহার করা , মূলত, এর অর্থ হল আপনি নিজের অবজেক্টটি নিয়ে যান এবং এটি অন্য কোনও বস্তুর ভিতরে রেখে দেন যা একটি প্রতিরক্ষামূলক শেলের মতো কাজ করবে। এটির জন্য আপনার মূল ক্লাসটি বাড়ানোর প্রয়োজন হবে না। এখানে একটি উদাহরণ:

class SecureContainer
{

    protected $target = null;
    protected $acl = null;

    public function __construct( $target, $acl )
    {
        $this->target = $target;
        $this->acl = $acl;
    }

    public function __call( $method, $arguments )
    {
        if ( 
             method_exists( $this->target, $method )
          && $this->acl->isAllowed( get_class($this->target), $method )
        ){
            return call_user_func_array( 
                array( $this->target, $method ),
                $arguments
            );
        }
    }

}

এবং আপনি এই ধরণের কাঠামোটি কীভাবে ব্যবহার করবেন:

// assuming that you have two objects already: $currentUser and $controller
$acl = new AccessControlList( $currentUser );

$controller = new SecureContainer( $controller, $acl );
// you can execute all the methods you had in previous controller 
// only now they will be checked against ACL
$controller->actionIndex();

আপনি লক্ষ্য করতে পারেন, এই সমাধানের বিভিন্ন সুবিধা রয়েছে:

  1. সংযোজন কেবলমাত্র উদাহরণ নয়, যে কোনও বস্তুর উপরে ব্যবহার করা যেতে পারে Controller
  2. অনুমোদনের জন্য পরীক্ষা করা লক্ষ্য বস্তুর বাইরে ঘটে, যার অর্থ:
    • মূল বস্তু, প্রবেশাধিকার নিয়ন্ত্রণ জন্য দায়ী নয় মেনে চলে SRP
    • যখন আপনি "অনুমতি অস্বীকৃত" পেয়ে যান, আপনি কোনও নিয়ন্ত্রণকারীর ভিতরে লক না হয়ে থাকেন, আরও বিকল্প
  3. আপনি এই সুরক্ষিত উদাহরণটি অন্য কোনও বস্তুতে ইনজেক্ট করতে পারেন , এটি সুরক্ষা বজায় রাখবে
  4. এটিকে জড়িয়ে রাখুন এবং এটি ভুলে যান .. আপনি পারবেন ভান পারেন যে এটি আসল বস্তু, এটি একই প্রতিক্রিয়া জানাবে

তবে , এই পদ্ধতিতেও একটি বড় সমস্যা রয়েছে - আপনি সুরক্ষিত অবজেক্ট প্রয়োগ এবং ইন্টারফেস (যা বিদ্যমান পদ্ধতিগুলি অনুসন্ধানের জন্যও প্রযোজ্য) বা কিছু উত্তরাধিকার শৃঙ্খলার অংশ কিনা তা আপনি স্থানীয়ভাবে পরীক্ষা করতে পারবেন না।

দ্বিতীয় অংশ / উত্তর (বস্তুর জন্য আরবিএসি)

এই ক্ষেত্রে আপনার প্রধান পার্থক্যটি স্বীকৃত হওয়া উচিত তা হ'ল আপনি ডোমেন অবজেক্টস (উদাহরণস্বরূপ Profile:) নিজেই মালিক সম্পর্কে বিশদ বিবরণ ধারণ করেন। এর অর্থ হ'ল আপনার যাচাই করার জন্য, যদি (এবং কোন স্তরে) ব্যবহারকারীর অ্যাক্সেস পেয়ে থাকে তবে আপনার এই লাইনটি পরিবর্তন করতে হবে:

$this->acl->isAllowed( get_class($this->target), $method )

মূলত আপনার দুটি বিকল্প রয়েছে:

  • প্রশ্নযুক্ত বস্তুর সাথে এসিএল সরবরাহ করুন। তবে আপনাকে সাবধান থাকতে হবে ডেমিটারের আইন লঙ্ঘন করবেন না :

    $this->acl->isAllowed( get_class($this->target), $method )
    
  • সমস্ত প্রাসঙ্গিক বিশদ অনুরোধ করুন এবং এসিএলকে যা প্রয়োজন তা কেবল সরবরাহ করুন যা এটি আরও কিছুটা ইউনিট-টেস্টিং বান্ধব করে তুলবে:

    $command = array( get_class($this->target), $method );
    /* -- snip -- */
    $this->acl->isAllowed( $this->target->getPermissions(), $command )
    

এমন কয়েকটি ভিডিও যা আপনাকে নিজের প্রয়োগের সাথে আসতে সহায়তা করতে পারে:

পার্শ্ব নোট

এমভিসির মডেল কী তা আপনার কাছে সাধারণ (এবং সম্পূর্ণ ভুল) বোঝার মতো মনে হচ্ছে। মডেল কোনও শ্রেণি নয় । আপনার যদি বর্গের নামযুক্ত শ্রেণি FooBarModelবা উত্তরাধিকার সূত্রে প্রাপ্ত কিছু থাকে AbstractModelতবে আপনি এটি ভুল করছেন।

যথাযথ এমভিসিতে মডেলটি একটি স্তর, এতে প্রচুর ক্লাস থাকে। ক্লাসের বড় অংশকে দায়িত্বের উপর ভিত্তি করে দুটি দলে ভাগ করা যায়:

- ডোমেন বিজনেস লজিক

( আরও পড়ুন : এখানে এবং এখানে ):

এই শ্রেণীর শ্রেণীর উদাহরণগুলি মূল্যবোধের গণনা, বিভিন্ন শর্ত পরীক্ষা করে, বিক্রয় বিধি প্রয়োগ করে এবং আপনি "ব্যবসায়িক যুক্তি" বলবেন এমন সমস্ত কিছু করে। কীভাবে ডেটা সংরক্ষণ করা হয়, কোথায় তা সংরক্ষণ করা হয় বা স্টোরেজ প্রথম স্থানে থাকলেও তাদের কোনও ক্লু নেই।

ডোমেন বিজনেস অবজেক্ট ডাটাবেসের উপর নির্ভর করে না। আপনি যখন চালান তৈরি করছেন তখন তথ্য কোথা থেকে আসে তা বিবেচনা করে না। এটি এসকিউএল বা দূরবর্তী আরএসটি এপিআই, অথবা এমএসওয়ার্ড ডকুমেন্টের এমনকি স্ক্রিনশট হতে পারে। ব্যবসায়িক যুক্তি কোনও পরিবর্তন করে না।

- ডেটা অ্যাক্সেস এবং স্টোরেজ

এই গোষ্ঠীর ক্লাস থেকে তৈরি দৃষ্টান্তগুলিকে কখনও কখনও ডেটা অ্যাক্সেস অবজেক্টস বলা হয়। সাধারণত স্ট্রাকচারগুলি যা ডেটা ম্যাপার প্রয়োগ করে প্যাটার্ন করে (একই নামের ORM গুলি দিয়ে বিভ্রান্ত করবেন না .. কোনও সম্পর্ক নেই)। এটি হ'ল আপনার এসকিউএল স্টেটমেন্টগুলি (বা সম্ভবত আপনার ডোমডোকামেন্ট, কারণ আপনি এটি এক্সএমএলে সংরক্ষণ করেছেন)।

দুটি প্রধান অংশের পাশাপাশি, উদাহরণস্বরূপ / শ্রেণীর আরও একটি গ্রুপ রয়েছে, যা উল্লেখ করা উচিত:

- সেবা

এটি আপনার এবং তৃতীয় পক্ষের উপাদানগুলি খেলতে আসে। উদাহরণস্বরূপ, আপনি "প্রমাণীকরণ" পরিষেবা হিসাবে ভাবতে পারেন, যা আপনার নিজস্ব বা কিছু বাহ্যিক কোড সরবরাহ করতে পারে। এছাড়াও "মেল প্রেরক" হ'ল একটি পরিষেবা যা কোনও পিএইচপিএমেলার বা সুইফটমেলার বা আপনার নিজস্ব মেইল-প্রেরক উপাদানটির সাথে কিছু ডোমেন অবজেক্ট একসাথে বুনতে পারে।

পরিষেবাগুলির অন্য উত্সটি ডোমেন এবং ডেটা অ্যাক্সেস স্তরগুলিতে বিমূর্ত হয়। এগুলি নিয়ন্ত্রণকারীদের দ্বারা ব্যবহৃত কোডটি সহজ করার জন্য তৈরি করা হয়েছে। উদাহরণস্বরূপ: নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করতে বেশ কয়েকটি ডোমেন অবজেক্ট এবং ম্যাপারগুলির সাথে কাজ করার প্রয়োজন হতে পারে । তবে, কোনও পরিষেবা ব্যবহার করে, এটির নিয়ামকটিতে কেবল একটি বা দুটি লাইন প্রয়োজন হবে।

পরিষেবাগুলি তৈরি করার সময় আপনাকে যা মনে রাখতে হবে তা হ'ল পুরো স্তরটি পাতলা হওয়ার কথা । পরিষেবাগুলিতে কোনও ব্যবসায়িক যুক্তি নেই। তারা কেবল ডোমেন অবজেক্ট, উপাদান এবং ম্যাপারদের জাগল করতে।

তাদের সকলের মধ্যে একটির সাধারণ জিনিসগুলির মধ্যে একটি হ'ল পরিষেবাগুলি কোনও সরাসরি উপায়ে ভিউ স্তরকে প্রভাবিত করে না এবং এতো পরিমাণ স্বায়ত্তশাসিত হয় যে তারা এমভিসি কাঠামোর বাইরেও হতে পারে (এবং প্রায়শই ছাড়তে পারে - ব্যবহৃত হয়)। এছাড়াও এই জাতীয় স্বাবলম্বী কাঠামো পরিষেবা এবং বাকী প্রয়োগের মধ্যে চূড়ান্তভাবে কম মিলনের কারণে একটি ভিন্ন কাঠামো / আর্কিটেকচারে মাইগ্রেশনকে অনেক সহজ করে তোলে।


34
আমি কয়েক মাসের চেয়ে আমি এটি পুনরায় পড়াতে 5 মিনিটের মধ্যে আরও শিখেছি। আপনি কি এর সাথে সম্মত হবেন: পাতলা নিয়ন্ত্রকরা পরিষেবাগুলিতে প্রেরণ করেন যা দেখার ডেটা সংগ্রহ করে? এছাড়াও, আপনি যদি কখনও প্রশ্ন সরাসরি গ্রহণ করেন তবে দয়া করে আমাকে একটি বার্তা প্রেরণ করুন।
স্টিফেন

4
আমি আংশিকভাবে একমত। ভিউ থেকে ডেটা সংগ্রহ এমভিসি ট্রাইডের বাইরে ঘটে যখন আপনি Requestউদাহরণটি শুরু করেন (বা এর কোনও এনালগ)। নিয়ামক কেবল Requestউদাহরণ থেকে ডেটা উত্তোলন করে এবং এর বেশিরভাগটিকে যথাযথ পরিষেবাদিতে (এর কিছু দেখতেও যায়) passes পরিষেবাগুলি সেই কাজগুলি সম্পাদন করে যা আপনি তাদের করার আদেশ দিয়েছিলেন। তারপরে, যখন ভিউ সাড়া জেনারেট করে, এটি পরিষেবাগুলি থেকে ডেটা অনুরোধ করে এবং সেই তথ্যের উপর ভিত্তি করে প্রতিক্রিয়া উত্পন্ন করে। প্রতিক্রিয়াটি হ'ল এইচটিএমএল একাধিক টেম্পলেট বা কেবল একটি HTTP অবস্থান শিরোনাম থেকে তৈরি করা যেতে পারে। নিয়ামক দ্বারা সেট করা রাজ্যের উপর নির্ভর করে।
tereško

4
সরল ব্যাখ্যাটি ব্যবহার করতে: নিয়ামক মডেল করতে এবং লিখতে "লেখেন", মডেল থেকে "পড়া" দেখুন। মডেল স্তর হ'ল এমভিসি দ্বারা অনুপ্রাণিত ওয়েব সম্পর্কিত সমস্ত নিদর্শনগুলির প্যাসিভ কাঠামো।
tereško

@ স্টাফেন, সরাসরি প্রশ্ন জিজ্ঞাসা করার জন্য, আপনি সর্বদা আমাকে টুইটারে বার্তা দিতে পারেন। অথবা আপনি কি কিন্ডা "দীর্ঘ-রূপ" নিয়ে প্রশ্ন করেছিলেন, এটি 140 টি অক্ষরে ক্র্যাম করা যায় না?
tereško

মডেল থেকে পড়া: এর অর্থ মডেলটির জন্য কিছু সক্রিয় ভূমিকা রয়েছে? আমি এর আগে কখনও শুনিনি। যদি এটি আপনার পছন্দ হয় তবে আমি সর্বদা টুইটারের মাধ্যমে আপনাকে একটি লিঙ্ক পাঠাতে পারি। আপনি দেখতে পাচ্ছেন, এই প্রতিক্রিয়াগুলি দ্রুত কথোপকথনে পরিণত হয় এবং আমি এই সাইট এবং আপনার টুইটার অনুসারীদের প্রতি শ্রদ্ধাশীল হওয়ার চেষ্টা করছিলাম।
স্টিফেন

16

এসিএল এবং নিয়ন্ত্রণকারীরা

প্রথমত: এগুলি প্রায়শই বিভিন্ন জিনিস / স্তর। আপনি উদাহরণস্বরূপ নিয়ামক কোডের সমালোচনা করার সময় এটি উভয়কে একসাথে রাখে - সম্ভবত স্পষ্টতই খুব শক্ত 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


দুটি প্রশ্ন: কমান্ডনটফাউন্ডআরস্পোনস এবং কমান্ডনোটলয়েড রেসপোনস: আপনি কি এসিএল শ্রেণি থেকে রাউটার বা নিয়ামকের কাছে পাস করে সর্বজনীন প্রতিক্রিয়া আশা করবেন? 2: আপনি যদি পদ্ধতি + বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করতে চান তবে আপনি কীভাবে এটি পরিচালনা করবেন?
স্টিফেন

1: প্রতিক্রিয়া প্রতিক্রিয়া, এখানে এটি এসিএল থেকে নয় তবে রাউটার থেকে, এসিএল রাউটারকে প্রতিক্রিয়া প্রকারটি খুঁজে পেতে সহায়তা করে (খুঁজে পাওয়া যায় না, বিশেষত: নিষিদ্ধ)। 2: নির্ভর করে। আপনি যদি ক্রিয়া থেকে প্যারামিটার হিসাবে গুণাবলী বোঝাতে চান এবং আপনার পরামিতিগুলির সাথে ACL'ing প্রয়োজন, সেগুলিকে ACL এর অধীনে রাখুন।
hakre

13

একটি সম্ভাবনা হ'ল আপনার সমস্ত কন্ট্রোলারকে অন্য শ্রেণিতে আবদ্ধ করা যা কন্ট্রোলারকে প্রসারিত করে এবং অনুমোদনের জন্য যাচাই করার পরে এটি সমস্ত ফাংশন কলকে মোড়কানো ইভেন্টগুলিতে অর্পণ করে।

আপনি প্রেরণকারীগুলিতে, এটি আরও প্রবাহিত করতে পারেন (যদি আপনার অ্যাপ্লিকেশনটিতে সত্যই একটি থাকে) এবং নিয়ন্ত্রণ পদ্ধতির পরিবর্তে ইউআরএলগুলির উপর ভিত্তি করে অনুমতিগুলি সন্ধান করতে পারেন।

সম্পাদনা : আপনার যদি কোনও ডাটাবেস, একটি এলডিএপি সার্ভার ইত্যাদির অ্যাক্সেসের প্রয়োজন হয় তবে তা প্রশ্নটির অর্থেগোনাল। আমার বক্তব্যটি ছিল আপনি নিয়ন্ত্রণকারী পদ্ধতির পরিবর্তে URL এর ভিত্তিতে কোনও অনুমোদন প্রয়োগ করতে পারেন। এগুলি আরও দৃ is় কারণ আপনি সাধারণত আপনার ইউআরএলগুলি পরিবর্তন করবেন না (ইউআরএলস অঞ্চল ধরণের পাবলিক ইন্টারফেস), তবে আপনি পাশাপাশি আপনার কন্ট্রোলারের প্রয়োগ পরিবর্তন করতে পারেন।

সাধারণত, আপনার এক বা একাধিক কনফিগারেশন ফাইল রয়েছে যেখানে আপনি নির্দিষ্ট ইউটিউর নিদর্শন নির্দিষ্ট প্রমাণীকরণের পদ্ধতি এবং অনুমোদনের দিকনির্দেশগুলিতে ম্যাপ করেন। প্রেরক, নিয়ন্ত্রণকারীদের কাছে অনুরোধ প্রেরণের আগে, ব্যবহারকারী নির্ধারিত কিনা তা নির্ধারণ করে এবং যদি তিনি না থাকেন তবে প্রেরণটি বাতিল করে দেয়।


দয়া করে, আপনি নিজের উত্তর আপডেট করতে এবং ডিসপ্যাচার সম্পর্কে আরও বিশদ যুক্ত করতে পারেন। আমার প্রেরণকারী রয়েছে - এটি ইউআরএল দ্বারা আমার কাছে নিয়ন্ত্রকের কী পদ্ধতিতে কল করা উচিত তা সনাক্ত করে। তবে আমি বুঝতে পারি না কীভাবে আমি ডিসপ্যাচারে ভূমিকা নিতে পারি (এটি করার জন্য আমার ডিবি অ্যাক্সেস করতে হবে)। আশা করি তোমাকে শীঘ্রই শুনতে পাবো.
কিরজিলা

আহা, আপনার ধারণা পেয়েছে। আমার পদ্ধতিটি অ্যাক্সেস না করে মৃত্যুদণ্ড কার্যকর করার অনুমতি দেওয়া উচিত! থাম্বস আপ! শেষ অমীমাংসিত প্রশ্ন - এসিএল থেকে কীভাবে মডেল অ্যাক্সেস করবেন। কোন ধারনা?
কিরজিলা

কিরজিলা @ কন্ট্রোলারদের সাথে আমারও একই সমস্যা রয়েছে। দেখে মনে হচ্ছে নির্ভরতা কোথাও কোথাও থাকা উচিত। এসিএল না হলেও, মডেল স্তরের কী হবে? কীভাবে আপনি এটিকে নির্ভরতা থেকে রক্ষা করতে পারেন?
স্টিফেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.