ডিডিডি প্রয়োগ করছে: ব্যবহারকারী এবং অনুমতি


16

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

  • আমি (আশাবাদী) ব্যবহারকারী এবং অনুমতিগুলির যুক্তি পৃথক করার পিছনে যুক্তিটি বুঝতে পারি: এটি একটি সমর্থনকারী ডোমেন এবং এটি একটি পৃথক সীমিত প্রসঙ্গ।
  • মূল ডোমেনে, কোনও ব্যবহারকারী নেই, কেবল লেখক, মডারেটর ইত্যাদি These এগুলি কোনও পরিষেবা ব্যবহার করে পরিচয় এবং অ্যাক্সেস প্রসঙ্গে পৌঁছে দেওয়া এবং তারপরে প্রাপ্ত ব্যবহারকারী সামগ্রী এবং মডারেটরের অনুবাদ করে তৈরি করা হয় ting
  • ডোমেন অপারেশনগুলিকে প্যারামিটার হিসাবে সম্পর্কিত ভূমিকার সাথে ডাকা হয়: যেমন:

    ModeratePost( ..., moderator);

  • প্রদত্ত মডারেটর উদাহরণটি শূন্য না হলে ডোমেন অবজেক্টের পদ্ধতিটি পরীক্ষা করে (ব্যবহারকারী যদি পরিচয় এবং অ্যাক্সেস প্রসঙ্গে জিজ্ঞাসা করে মডারেটরের ভূমিকা না থাকে তবে মডারেটর উদাহরণটি নাল হবে)।

  • একটি ক্ষেত্রে, এটি কোনও পোস্ট পরিবর্তন করার আগে একটি অতিরিক্ত চেক করে:

    if (forum.IsModeratedby(moderator))

আমার প্রশ্নগুলি হ'ল:

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

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

এমনকি খুব বেশি জটিল নয় এমন নিয়মগুলিও যেমন: "একটি পোস্ট কেবল তার মালিক বা একটি সম্পাদক দ্বারা সম্পাদনা করা উচিত", এই পদ্ধতিটি ভেঙে গেছে বলে মনে হচ্ছে, বা কমপক্ষে আমি এটি বাস্তবায়নের সঠিক উপায় দেখতে পাচ্ছি না।

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

মূল ডোমেনে অনুমতিগুলি টানতে এবং ডোমেন অবজেক্টগুলির পদ্ধতি বা পরিষেবাগুলিতে সেগুলি পরীক্ষা করে, আমি স্কোয়ার একের সাথে শেষ করব: ডোমেনের সাথে সুরক্ষা উদ্বেগগুলি মিশিয়ে।

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


আপনার এখানে যা প্রয়োজন তা আপনি পেতে পারেন: stackoverflow.com/a/23485141/329660 এছাড়াও, অ্যাক্সেস কন্ট্রোল প্রসঙ্গটি কোনও সংস্থান আইডি সম্পর্কে জানার অর্থ এই নয় যে এটি কী ধরণের সত্তা বা এটি কী তা সম্পর্কে ডোমেন জ্ঞান রয়েছে আছে।
guillaume31

ধন্যবাদ, আমি এই পোস্টটি আগে দেখেছি, আমার সমস্যাটি হ'ল সম্পাদনাটি শেষে যা বলেছে: আমি অ্যাক্সেস নিয়ন্ত্রণকে আমার মূল ডোমেনের বাইরে নিয়ে যেতে চাই তবে আমার মনে হয় আমি আমার বাস্তবায়ন দিয়ে একটি প্রাচীরকে আঘাত করেছি। তবে রিসোর্স আইডি সম্পর্কে আপনার পরামর্শটি বোঝায়: যেহেতু আমি মূল ডোমেনে ব্যবহারকারীর বা ভূমিকা ধারণাটি ব্যবহার করি না তবে কংক্রিটের ভূমিকা রাখি, সম্ভবত আমি বিসি সুরক্ষায় রিসোর্সের ধারণাটি ব্যবহার করতে পারি এবং এগুলি সম্পর্কিত কংক্রিটে ম্যাপ করতে পারি maybe ডোমেন ধারণা। একটি চেষ্টা মূল্য, ধন্যবাদ!
লিটলপিলগ্রিম

লিঙ্কের কোড নমুনাগুলি কমপক্ষে "আমি দেখতে পাচ্ছি না কীভাবে আমি এটি আরও জটিল সুরক্ষা মডেলটির সাথে মানিয়ে নিতে পারি" ?
guillaume31

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

অবশ্যই এটি অ্যাপ্লিকেশন পরিষেবাগুলিতে হওয়া উচিত ... আমি ভেবেছিলাম কোডের কিছু অংশ থেকে এটি পরিষ্কার UserService @AccessControlList[inf3rno]হয়েছিল যা আমি যুক্ত উত্তর দিয়েছি in
guillaume31

উত্তর:


6

কখনও কখনও আসল অ্যাক্সেস নিয়ন্ত্রণের নিয়ম এবং অ্যাক্সেস নিয়ন্ত্রণে সীমান্তরেখা ডোমেন আক্রমণকারীদের মধ্যে পার্থক্য করা কখনও কখনও কঠিন।

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

ভন ভার্ননের assert (forum.IsModeratedBy(moderator))উদাহরণটি সম্ভবত ডোমেনের বাইরে হওয়া উচিত ছিল তবে এটি সবসময় সম্ভব হয় না।

আমার কেবল ইউজারআইডিই নয়, সুরক্ষিত সংস্থার সনাক্তকারী (পোস্ট, ফোরাম ইত্যাদির আইডি) সুরক্ষা প্রসঙ্গে যেতে হবে, যা সম্ভবত এই বিষয়গুলির যত্ন নেবে না (এটি কি সঠিক?)

যদি বিসি কোনও সুরক্ষা থাকে এবং আপনি এই যুক্তিটি পরিচালনা করতে চান তবে ফোরামটি কী কী তা বিস্তারিত জানার দরকার নেই তবে:

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

যেহেতু উভয় উত্তর কার্যকর এবং কমবেশি একই দিক নির্দেশ করছে আমি সেগুলি উভয়কেই উন্নত করেছি। আমি এইটিকে গ্রহণ করেছি, কারণ @ গিলিউম ৩১ ভার্ননের বাস্তবায়ন সম্পর্কে আমার প্রশ্নের কম-বেশি উত্তর দিয়েছে এবং আমি বিসি সুরক্ষা সংস্থার সংস্থান ব্যবহারের বিষয়ে তার ইঙ্গিতের ভিত্তিতে আমার বাস্তবায়ন চালিয়ে যাব।
লিটলপিলগ্রিম

আমাকে বলতে হবে যে আমি এটি আমার উত্তরের সম্পূর্ণ বিপরীতে মনে করি।
ইয়ান

1
সম্ভবত আমি এখনই খুব বিভ্রান্ত হয়ে পড়েছি, তবে আমার ব্যাখ্যাটি ছিল (উভয় উত্তরের জন্য): ১. সুরক্ষা উদ্বেগকে ডোমেনের বাইরে রাখুন এবং সুরক্ষা বিসিটিকে পরিষেবা হিসাবে ব্যবহার করুন ২. কোনও ডোমেন অবজেক্টকে ডাকার আগে পরিষেবাটি কল করুন ৩. পরিষেবা ব্যবহারকারী / অ্যাক্সেস থেকে মডারেটর, লেখক ইত্যাদির কাছে moderator = securityService.GetModerator(userId, forumId) ম্যাপিংটি করবে 4.. এই উপাদানগুলিতে মডারেটরের মতো ডোমেন লজিক প্রয়োগ করা হবে E সেখানে
লিটলপিলগ্রিম

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

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

5

প্রমাণীকরণ এবং অনুমোদন ডিডিডি-র জন্য একটি খারাপ উদাহরণ।

আপনার সংস্থা সুরক্ষা পণ্য তৈরি না করে এই জিনিসগুলির কোনওটিই ডোমেনের অংশ নয়।

ব্যবসায় বা ডোমেনের প্রয়োজনীয়তাটি হ'ল বা হওয়া উচিত, "আমাকে ভূমিকা ভিত্তিক প্রমাণীকরণ প্রয়োজন"

তারপরে আপনি কোনও ডোমেন ফাংশন কল করার আগে ভূমিকাটি পরীক্ষা করে দেখুন।

যেখানে আপনার জটিল প্রয়োজনীয়তা রয়েছে যেমন 'আমি নিজের পোস্টগুলি সম্পাদনা করতে পারি তবে অন্যরা নয়' তা নিশ্চিত করে যে আপনার ডোমেন সম্পাদনা কার্যটি আলাদা করে দেয় EditOwnPost()এবং EditOthersPost()যাতে আপনার ভূমিকা ম্যাপিংয়ের জন্য একটি সাধারণ ফাংশন থাকে

আপনি কার্যকারিতাটিকে ডোমেন অবজেক্টগুলিতেও আলাদা করতে পারেন, যেমন Poster.EditPost()এবং Moderator.EditPost()এটি আরও ওওপি পদ্ধতি, যদিও আপনার পছন্দটি কোনও পদ্ধতি কোনও ডোমেন পরিষেবাতে বা কোনও ডোমেন অবজেক্টে রয়েছে কিনা তার উপর নির্ভর করে।

তবে আপনি কোডটি পৃথক করতে বেছে নিয়েছেন রোল ম্যাপিং ডোমেনের বাইরে ঘটবে। সুতরাং উদাহরণস্বরূপ আপনার যদি কোনও ওয়েবপিআই নিয়ামক থাকে:

PostController : ApiController
{
    [Authorize(Roles = "User")]
    public void EditOwnPost(string postId, string newContent)
    {
        this.postDomainService.EditOwnPost(postId, string newContent);
    }

    [Authorize(Roles = "Moderator")]
    public void EditOtherPost(string postId, string newContent)
    {
        this.postDomainService.EditOtherPost(postId, string newContent);
    }
}

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

ডোমেন ক্রিয়াগুলির পার্থক্য স্বীকার করে, তবে সুরক্ষার প্রয়োজনীয়তাটি কেবল "ভূমিকা দ্বারা কার্যকারিতা সীমাবদ্ধ করা যায়"

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


4
ভূমিকা "স্ট্যাটিকালি" চেক করা কিছুটা সরল istic যদি কোনও মডারেটরকে অন্য একজন মডারেটরের পোস্ট সম্পাদনা করার অনুমতি না দেওয়া হয় তবে কী হবে? এই চেকটি ডোমেনের অংশ হওয়া উচিত নয়?
রোদা হৌসনি আলাউই

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

1
@ ইরওয়ান, আমি যে ব্যবহারের ক্ষেত্রে কথা বলছি তা গতিশীল। হ্যালো ওয়ার্ল্ডের উদাহরণগুলিতে "প্রমাণীকরণ এবং অনুমোদনের পক্ষে একটি খারাপ উদাহরণ" বাক্যটি বেআইনী করা। দুর্ঘটনাজনিত জটিলতা এড়াতে এবং ডোমেন জটিলতা পরিচালনা করার জন্য ডিডিডি এখানে রয়েছে is গতিশীল অনুমতিগুলি দুর্ঘটনাজনিত জটিলতা বা এমন কিছু নয় যা বাস্তব জীবনে ঘটে না।
রোদা হৌসনি আলাউই

1
আইএমএইচও, আপনার সমাধান সহ সমস্যাটি হ'ল এটি গ্রাহককে সন্তুষ্ট করে না। গ্রাহকরা প্রায়শই এই সম্পর্কগুলিকে পরিবর্তনশীল করতে সক্ষম হতে চান। তদুপরি, যখন কোনও বিক্রেতা বিভিন্ন সংস্থাকে একই এন্টারপ্রাইজ সফটওয়্যার সরবরাহ করে তখনও তা ঘটে। যদি সফ্টওয়্যারটি খারাপভাবে টুইট-সক্ষম হয় তবে অবশেষে বিক্রেতা মারা যাবে die
রোদা হৌসনি আলাউই

1
"তবে এটি সাধারণত" খারাপ জিনিস "হিসাবে স্বীকৃত আপনার সুরক্ষা সেটিংস সময়ের সাথে সাথে অস্থায়ী হয়ে ওঠে যার কার্যকরভাবে আপনার অ্যাপ্লিকেশনটি নিরাপত্তাহীন হয়ে ওঠে" " সঠিক নকশা এবং পরীক্ষা দিয়ে এটি সম্পূর্ণরূপে পরিচালনাযোগ্য। তবে, আমার এক্সপি থেকে, সঠিক নকশা তৈরি করতে, ডোমেনের অনুমতি পরীক্ষা করতে হবে। বিকল্প হ'ল ইউটোপিয়া।
রোদা হৌসনি আলাউই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.