অ্যাক্সেস নিয়ন্ত্রণের জন্য স্ট্যান্ডার্ড অনুশীলন (নকশার ধরণ)


9

আমি আমার ইন্টারফেস ডিজাইন দিকে তাকিয়ে আছি এবং আমি সিদ্ধান্ত নিতে যা ভূমিকা ভিত্তিক প্রবেশাধিকার নিয়ন্ত্রণ বাস্তবায়ন সবচেয়ে "সঠিক" উপায় সংগ্রাম করছি, একজন প্রদত্ত userএবং subjectযে userঅ্যাক্সেস করতে চায়।


যতদূর আমি দেখতে পাচ্ছি আমার কাছে তিনটি মূল অপশন রয়েছে (চতুর্থটি প্রথম তিনটির জারজ এবং এক পঞ্চমটি চতুর্থের একটি টুইট):

  1. subjectঅনুমতিগুলির তালিকাসমূহের সাথে প্রশ্নটি করুন user-subject.allowAccess(user.getPermissionSet)
  2. প্রয়োজনীয় userঅনুমতিগুলির তালিকার সাথে অনুসন্ধান করুন subject-user.hasPermissionTo(subject.getRequiredPermissions())
  3. অনুমতিগুলির ছেদগুলি সনাক্ত করতে একটি তৃতীয় পক্ষের জিজ্ঞাসা করুন - accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet())
  4. তৃতীয় পক্ষের শ্রেণিতে "সিদ্ধান্ত" অর্পণ করার সময় হয় subject/ / কে প্রশ্ন করুনuser
  5. অ্যাক্সেসের অনুমতি না থাকলে অ্যাক্সেস করার userচেষ্টা করুন subjectএবং একটি ত্রুটি নিক্ষেপ করুন

আমি বিকল্প চারটির দিকে ঝুঁকছি - subjectএতে একটি accessControllerক্ষেত্র রয়েছে, যেখানে subject.userMayAccess(User user)অপারেশনটিকে লা দেওয়ার জন্য কল রয়েছে :

class Subject {
    public function display(user) {
        if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
            display403(); //Or other.. eg, throw an error..
        }
    }
}

.. তবে তারপরে এটি আরও প্রশ্ন উত্থাপন করে:

  • accessControllerস্ট্যাটিক বনাম একটি ক্ষেত্র হওয়া উচিত ..?
  • এটি subject জানতে সক্ষম হওয়ার জন্য কী অনুমতিগুলির প্রয়োজন তা কোনও জানা উচিত ?
  • কল করার ক্ষেত্রে এখানে ন্যূনতম জ্ঞানের নীতিটি কোথায় কার্যকর হয় subject.display()? কলকারীরা subject.display()কি কখনও জানবেন যে অ্যাক্সেস নিয়ন্ত্রণ কার্যকর? ( subject.display()একটি চূড়ান্ত "টেম্পলেট পদ্ধতি" কোথায় )
  • আছে subject.display()প্রবেশাধিকার নিয়ন্ত্রণ, পরিচালনা ব্যতিক্রম যেখানে ব্যবহারকারী প্রয়োজনীয় অনুমতি নেই নিক্ষেপ?

এই পরিস্থিতিতে "সেরা অনুশীলন" হিসাবে বিবেচিত হবে কি? চেকগুলি সম্পাদন করার দায়িত্বটি আসলে কোথায় হওয়া উচিত?

যেহেতু এটি উভয়ই একাডেমিক অংশ যা তত্পর বাস্তবায়নে অগ্রসর হবে, নকশার নিদর্শনগুলির উল্লেখগুলি প্রশংসা করা হবে।

উত্তর:


7

সর্বোত্তম অনুশীলন হ'ল সুরক্ষিত অঞ্চলে কলগুলি বাধা দেওয়ার জন্য ইন্টারসেপ্টর প্যাটার্ন নামে পরিচিত কিছু ব্যবহার করা।

এটি আপনার অ্যাক্সেস এন্ট্রি পয়েন্টগুলিতে প্রয়োগ করা এওপি বা ক্রস কাটিয়া উদ্বেগগুলির দ্বারা ব্যবহার করা যায়।

কে এটি দেখতে সক্ষম তা সম্পর্কে বিষয়টি কখনই জানতে হবে না। এটি অযৌক্তিকভাবে সাবজেক্ট কোডটিকে জটিল করে তোলে এবং এটির প্রয়োজন হওয়ার কোনও কারণ নেই, যদি না আপনি অজান্তে একই ফাংশনে সরাসরি অ্যাক্সেস মেকানিজম সরবরাহ না করেন।

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

আপনি যদি এওপি বা ইন্টারসেপ্টর প্যাটার্ন পদ্ধতির ব্যবহার করেন তবে এটি কোনও প্রয়োজনীয় ব্যতিক্রম ছুঁড়ে ফেলবে এবং নিক্ষেপ করা কোনও ব্যতিক্রম হ্যান্ডেল করার বিষয়টি ক্লায়েন্টের (কলার) উপর নির্ভর করবে।

এইভাবে আপনি আপনার ক্লায়েন্ট, পরিষেবা এবং প্রমাণীকরণ কোডকে জ্ঞান বা কার্যকারিতার অন্তর্নিহিত ছাড়াই আলাদা রাখবেন।



2

আমি মনে করি আপনার বিকল্প 3 নিকটস্থ হয়, কিন্তু জিজ্ঞাসাবাদের পরিবর্তে userএবং subjectতাদের অনুমতি সেট সম্পর্কে আপনাকে পাস করা উচিত userএবং subjectএক্সেস নিয়ামক হতে।

class Subject {
    public function display(user) {
        if(!accessController.checkAccess(this, user, AccessControl.Read)) {
            display403(); //Or other.. eg, throw an error..
        }
    }
}

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

আপনার উদাহরণ থেকে অন্য উপাদান সম্ভবত অনুপস্থিত যা হ'ল অপারেশনটি কী করা হচ্ছে। কিছু ব্যবহারকারী কিছু ডেটা কিন্তু, আপডেটে পড়তে মুছতে চালানো ইত্যাদি অধিকারী হবে তাই আপনি যদি একটি থাকতে পারে checkAccessতিন পরামিতি সঙ্গে এক্সেস নিয়ামক উপর পদ্ধতি: user, subject, operationcheckAccessঅ্যাক্সেস কেন মঞ্জুরি দেওয়া হয়নি তা সম্পর্কিত তথ্য ফিরে পেতে আপনি কিছু অতিরিক্ত তথ্য সরবরাহ করতে চাইবেন ।

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

এটিকে প্লাগ করতে আপনি এওপি বা কিছু বয়লারপ্লিট কোড ব্যবহার করুন না কেন, আমার মতে, কম গুরুত্বপূর্ণ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.