সারসংক্ষেপ
সিকিউআরএস / ডিডিডি-তে অনুমোদনের জন্য প্রতি-আদেশ / কোয়েরি প্রয়োগ করা উচিত কি না?
আমি প্রথমবারের মতো কম বেশি কঠোরভাবে ডিডিডি সিকিউআরএস প্যাটার্ন ব্যবহার করে একটি অনলাইন অ্যাপ্লিকেশন বিকাশ করছি। আমি কিছু সমস্যায় জড়িয়ে পড়েছি, যা সত্যই আমি মাথা ঘুরিয়ে নিতে পারি না।
আমি যে অ্যাপ্লিকেশনটি তৈরি করছি তা হ'ল একটি অ্যাপ্লিকেশন যা লোকদের খাত্তর তৈরি করতে দেয় এবং সেইসাথে অন্যান্য লোককে এগুলি দেখতে / সম্পাদনা / মোছার মঞ্জুরি দেয়, যেমন কর্মচারী। কোনও খাত্তরের স্রষ্টাকে তার তৈরি করা খাতকের অ্যাক্সেসের অধিকারগুলি সম্পাদনা করতে সক্ষম হওয়া উচিত। এমনকি মালিকানা পরিবর্তন করতে পারে। ডোমেনটির দুটি সমষ্টি টিএলডেজার এবং টিউসার রয়েছে ।
আমি সুরক্ষা, অনুমোদন ইত্যাদির বিষয়ে ডিডিডি / সিকিউআরএস কীওয়ার্ড সহ অনেকগুলি পোস্ট পড়েছি তাদের মধ্যে বেশিরভাগই বলেছিলেন যে অনুমোদন একটি জেনেরিক সাবডোমেন ছিল , যদি না কেউ সুরক্ষা অ্যাপ্লিকেশন তৈরি করে।
এই ক্ষেত্রে, মূল ডোমেন অবশ্যই লেনদেন, ভারসাম্য এবং অ্যাকাউন্টগুলির সাথে আগ্রহী একটি অ্যাকাউন্টিং ডোমেন । তবে ঠিকঠাকগুলিতে সূক্ষ্ম দানযুক্ত অ্যাক্সেস পরিচালনা করতে সক্ষম হওয়ার কার্যকারিতাও প্রয়োজনীয়। আমি কীভাবে এটি ডিডিডি / সিকিউআরএস পদগুলিতে ডিজাইন করব তা ভাবছি।
এটি ডিডিডি টিউটোরিয়ালে সমস্ত জায়গার চারদিকে বলা হয়েছে যে কমান্ডগুলি সর্বব্যাপী ভাষার অংশ। তারা অর্থপূর্ণ। এগুলি দৃ actions় পদক্ষেপ যা "আসল জিনিস" উপস্থাপন করে।
যেহেতু সমস্ত কমান্ড এবং কোয়েরিগুলি প্রকৃত ক্রিয়া যা ব্যবহারকারীরা "বাস্তব জীবনে" চালিত করে, তাই অনুমোদনের বাস্তবায়নগুলি কি এই সমস্ত "কমান্ড" এবং "অনুসন্ধানগুলি" এর সাথে মিলিত হওয়া উচিত? উদাহরণস্বরূপ কোনও ব্যবহারকারীর TLedger.addTransaction () চালানোর অনুমোদন থাকবে তবে উদাহরণস্বরূপ TLedger.removeTransaction () নয়। অথবা, কোনও ব্যবহারকারীকে "getSummaries ()" কোয়েরি কার্যকর করার অনুমতি দেওয়া হবে তবে "getTransferences ()" নয়।
অ্যাক্সেসের অধিকার নির্ধারণের জন্য ত্রি-মাত্রিক ম্যাপিংটি ব্যবহারকারী-খাত্ত-কমান্ড বা ব্যবহারকারী-খাত্তর-কোয়েরির আকারে উপস্থিত থাকবে।
অথবা, একটি decoupled উপায়ে, "অনুমতি" নামক একটি ব্যবহারকারীর জন্য নিবন্ধিত হবে। অনুমতিগুলি যা নির্দিষ্ট কমান্ডের জন্য ম্যাপ করা হবে। উদাহরণস্বরূপ, অনুমতি "ম্যানেজট্রান্সট্র্যাকশনস" ব্যবহারকারীর "অ্যাডট্রান্সঅ্যাকশন ()", "সরান ট্রান্সজিশন ()" ইত্যাদি চালানোর অনুমতি দেয় etc.
অনুমতি ম্যাপিং ব্যবহারকারী -> খাতা -> কমান্ড / কোয়েরি
অনুমতি ম্যাপিং ব্যবহারকারী -> খাতা -> অনুমতি -> কমান্ড / কোয়েরি
এটা প্রশ্নের প্রথম অংশ। বা সংক্ষেপে, সিকিউআরএস / ডিডিডি-তে অনুমোদনের জন্য প্রতি-আদেশ বা প্রতি-কোয়েরি প্রয়োগ করা উচিত? অথবা, কমান্ডগুলি থেকে অনুমোদনকে ডিউপল করা উচিত?
দ্বিতীয়ত, অনুমতিগুলির ভিত্তিতে অনুমোদনের বিষয়ে। একজন ব্যবহারকারীকে তার লেজারগুলিতে বা যে লেজারগুলি পরিচালনা করার অনুমতি দেওয়া হয়েছে সেগুলির অনুমতিগুলি পরিচালনা করতে সক্ষম হওয়া উচিত।
- অনুমোদনের ব্যবস্থাপনার আদেশগুলি লেজারে ঘটে
আমি ইভেন্ট / কমান্ড / হ্যান্ডলারগুলিকে লেজার সমষ্টিতে যেমন গ্র্যান্ট পার্মিশন (), রিভোকপিরমিশন () ইত্যাদি যুক্ত করার কথা ভেবেছিলাম এই ক্ষেত্রে, এই বিধিগুলি কার্যকর করা কমান্ড হ্যান্ডলারের মধ্যে ঘটবে। তবে এই কমান্ডটি ব্যবহারকারীর আইডি অন্তর্ভুক্ত করার জন্য এটির সমস্ত কমান্ডের প্রয়োজন হবে। তারপরে আমি টিএলডিজারের সাথে চেক করব যদি সেই ব্যবহারকারীর সেই আদেশটি কার্যকর করার অনুমতি উপস্থিত থাকে।
উদাহরণ স্বরূপ :
class TLedger{
function addTransactionCmdHandler(cmd){
if (!this.permissions.exist(user, 'addTransaction')
throw new Error('Not Authorized');
}
}
- ব্যবহারকারীর মধ্যে অনুমোদনের কমান্ড
অন্য উপায় কাছাকাছি টিউসার মধ্যে অনুমতি অন্তর্ভুক্ত করা হবে। একজন টিউসারের এক সেট অনুমতি থাকবে। তারপরে, টিএলডजर কমান্ড হ্যান্ডলারগুলিতে, আমি ব্যবহারকারীকে পুনরুদ্ধার করব এবং কমান্ডটি কার্যকর করার অনুমতি আছে কিনা তা পরীক্ষা করে দেখব। তবে এর জন্য প্রতিটি টিএলড্ডার কমান্ডের জন্য টিউজার সমষ্টি সংগ্রহ করা আমার প্রয়োজন।
class TAddTransactionCmdHandler(cmd) {
this.userRepository.find(cmd.userId)
.then(function(user){
if (!user.can(cmd)){
throw new Error('Not authorized');
}
return this.ledgerRepository.find(cmd.ledgerId);
})
.then(function(ledger){
ledger.addTransaction(cmd);
})
}
- পরিষেবা সহ অন্য একটি ডোমেন
আরেকটি সম্ভাবনা হ'ল সম্পূর্ণভাবে অন্য অনুমোদনের ডোমেনটি মডেল করা। এই ডোমেনটি অ্যাক্সেসের অধিকার, অনুমোদন ইত্যাদিতে আগ্রহী হবে The অ্যাকাউন্টিং সাবডোমেন তারপরে এই অনুমোদনের ডোমেনটির আকারে অ্যাক্সেস করার জন্য কোনও পরিষেবা ব্যবহার করবে AuthorizationService.isAuthorized(user, command)
।
class TAddTransactionCmdHandler(cmd) {
authService.isAuthorized(cmd)
.then(function(authorized){
if (!authorized) throw new Error('Not authorized');
return this.ledgerRepository.find(cmd.ledgerId)
})
.then(function(){
ledger.addTransaction(cmd);
})
}
সর্বাধিক "ডিডিডি / সিকিউআরএস" উপায় কী হবে?