জাভাতে গতিশীল কোড মূল্যায়ন - চালাক বা ঝাপটায়?


30

আমি আমার আবেদনের জন্য জাভাতে একটি নমনীয় এসিএল কাঠামো তৈরি করার চেষ্টা করছি।

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

  • "জন উত্স ফুবার -১ দেখতে পারে"
  • "মেরি রিসোর্স FOBAR-1 দেখতে পারে"
  • "মেরি রিসোর্স ফুবার -১ সম্পাদনা করতে পারে"

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

  • "পাঁচ বছরেরও বেশি জ্যেষ্ঠতার সাথে বিভাগের 1 বিভাগের সমস্ত ব্যবহারকারী FOOBAR-1 রিসোর্সটি দেখতে পারবেন, অন্যথায় অনুমোদিত নয়"
  • "বিভাগ ২-এর সমস্ত ব্যবহারকারী, তারিখটি যদি 03/15/2016 এর পরে হয় তবে তারা ফুবার -২ রিসোর্সটি দেখতে পারবেন, অন্যথায় অনুমোদিত নয়"

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

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

  • return user.getDept() == 1 && user.seniority > 5;

এটি করার দ্বারা, পূর্বাভাসগুলি সহজেই ডাটাবেসে স্থির থাকতে পারে।

এই চালাক কি ? এই কি ঝাল ? এটা কি চিকিত্সা ? এটি কি ওভার ইঞ্জিনিয়ারড ? এটি কি নিরাপদ (স্পষ্টতই, জাভা রাইনো ইঞ্জিনটি স্যান্ডবক্স করতে পারে)।


8
সংকলিত অ্যাপ্লিকেশনটিতে যুক্তি স্থাপনের উপর এই ব্যবসায়িক নিয়মগুলিকে একটি ডাটাবেসে ঠেলে দেওয়ার সুবিধা কী?
উইনস্টন ইওয়ার্ট

6
@ উইনস্টোনউয়ার্ট বিধিগুলি বহিরাগত করার ফলে কোনও নিয়ম পরিবর্তন করা, যুক্ত করা বা অপসারণ করা হলে অ্যাপ্লিকেশনটি পুনরায় সংকলন এবং পুনরায় বিতরণের প্রয়োজনীয়তা দূর করে।
টুইটোফার

2
@ উইনস্টোনওয়ার্ট সম্পর্কিত: বৈধতার পক্ষে যদি অনেকগুলি বিবৃতি খারাপ হয়?

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

6
এটি আউটলুক ইমেল নিয়মের মতো বলে মনে হচ্ছে যা মূলত কোনও নিয়ম ইঞ্জিন যা ব্যবহারকারী দ্বারা কনফিগারযোগ্য।

উত্তর:


37

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

আপনার সমস্যাটি কোনও নিয়ম ইঞ্জিন বা সম্ভবত কোনও ডোমেন-নির্দিষ্ট ভাষা (ডিএসএল) দ্বারা আরও ভাল সমাধান করা যেতে পারে । এই ধারণাগুলি উপরে দেখুন, চাকা পুনরায় উদ্ভাবনের প্রয়োজন নেই।


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

6
@ টিউটোফার কিছু পূর্বাভাসের মূল্যায়ন করতে পুরো জাভাস্ক্রিপ্ট ইঞ্জিনটিকে টেনে নিয়ে যাওয়া এখনও মনে হয় 1) সম্পূর্ণ ওভারকিল, 2) ঝুঁকিপূর্ণ এবং 3) আমার কাছে ত্রুটি-প্রবণ। ঘটনাচক্রে, আপনি আপনার উদাহরণের ==পরিবর্তে ব্যবহার করেছেন used সমস্ত নিয়মটি যখন যুক্তিযুক্তভাবে সর্বদা শেষ করা উচিত তখন ===আপনি কি সত্যিই টুরিং সম্পূর্ণতা সরবরাহ করতে চান ? জাভা এবং জাভাস্ক্রিপ্টের মধ্যে সমস্ত মিথস্ক্রিয়া কোশার কিনা তা নিশ্চিত করার জন্য হুপসের মাধ্যমে ঝাঁপিয়ে পড়ার পরিবর্তে, আপনি কেন কিলিয়ান প্রস্তাবিত মত একটি সাধারণ পার্সার এবং দোভাষী লিখছেন না? এটি আপনার প্রয়োজন অনুসারে উপযুক্ত এবং সুরক্ষিত করা আরও সহজ হবে। এএনটিএলআর বা কিছু ব্যবহার করুন।
ডোভাল

6
@ ডোভাল একটি ছোট ডিএসএল লেখা হুবহু রকেট বিজ্ঞান নয়, এবং আমি একটি সহজ ভাষা 3 ঘন্টা থেকে 5 দিনের মধ্যে চাবুক করতে পারি। তবে এটি 1) সম্পূর্ণ ওভারকিল, 2) ঝুঁকিপূর্ণ এবং 3) আমার কাছে ত্রুটি-প্রবণ বলে মনে হয়। আপনি কি সত্যিই একটি সম্পূর্ণ মিনি-ভাষা লিখতে চান? যদি কিছু ব্যবসায়ের নিয়ম প্রত্যাশার চেয়ে জটিল হয় এবং সম্পূর্ণ বৈশিষ্ট্যযুক্ত ভাষার প্রয়োজন হয় তবে কী হবে? আপনি কি এখানে আবিষ্কার না-সিনড্রোমে ভুগছেন? চাকাটি পুনরায় উদ্ভাবন করার পরিবর্তে আপনি কেন বিদ্যমান ভাষা ব্যবহার করবেন না? ইতিমধ্যে যুদ্ধ-পরীক্ষা করা একটি ভাষা ব্যবহার করা আরও সহজ।
আমন

14
@amon যখন এটি হয়, আপনি কিলিয়ান যেমন বলেছিলেন তেমন একটি বাস্তব নিয়ম ইঞ্জিন (যা জাভাস্ক্রিপ্ট নয়) সন্ধান করে find উভয় পদ্ধতির ঝুঁকি সমীকরণ বিভ্রান্তিকর। কোনও টিউরিং-সম্পূর্ণ ভাষার জন্য দোভাষীকে সুরক্ষিত করার আপনার সমস্ত প্রচেষ্টা ধ্বংস করতে এটি কেবল একটি বাদ পড়ে; এটি একটি বিয়োগাত্মক প্রক্রিয়া। দুর্ঘটনাক্রমে একটি ছোট ডিএসএলকে বিপজ্জনক করে তোলা আরও কঠিন; এটি একটি অ্যাডিটিভ প্রক্রিয়া। আপনি যে ধরনের ভুলটি করতে পারেন সম্ভবত সিনট্যাক্স ট্রিটিকে ভুলভাবে ব্যাখ্যা করা এবং এটি ইউনিট পরীক্ষা করা যেতে পারে। আপনি সম্ভবত দুর্ঘটনাকৃতভাবে দোভাষীকে একটি হার্ড ড্রাইভের দক্ষতার ফর্ম্যাটটি দেবেন না।
ডোভাল

4
@ এমন: এমনকি জেএস স্নিপেটের পার্শ্ব প্রতিক্রিয়া নাও থাকতে পারে, তবে এটি কোনও বুলিয়ান মান ফিরিয়ে না দেওয়া পছন্দ করতে পারে :while (true) ;
বার্গি

44

আমি এটি করেছি এবং আমি সুপারিশ করছি যে আপনি এটি করবেন না।

আমি যা করেছি তা ছিল লুয়ার সমস্ত ব্যবসায়ের যুক্তি লিখতে এবং সেই লুয়া স্ক্রিপ্টটি একটি ডাটাবেসে সংরক্ষণ করে। যখন আমার অ্যাপ্লিকেশনটি শুরু হবে এটি স্ক্রিপ্টটি লোড করবে এবং চালিত করবে। নতুন বাইনারি বিতরণ না করেই আমি আমার অ্যাপ্লিকেশনটির ব্যবসায়িক যুক্তি আপডেট করতে পারি could

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

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


3

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

অন্য কথায়, আপনার যদি সংখ্যাযুক্ত বিভাগ থাকে, তবে ইউজার-বিভাগের চেক এবং একটি টুডিআইএসএফের পরে চেক পাওয়া সহজ হবে এবং তারপরে তাদের একটি বিভাগ = 2 এবং আজ>> 03/15/2016 থাকতে হবে। তারপরে যদি আপনি কোনও টুডিআইসফেস আগে পরীক্ষা করে দেখতে চান যাতে আপনি অনুমতিটির তারিখ শেষ করতে পারেন তবে আপনাকে টুডেআইসফোর ফাংশনটি লিখতে হবে।

আমি এটি ব্যবহারকারীর অনুমতিগুলির জন্য করিনি, তবে ডেটা বৈধতার জন্য এটি করেছি, তবে এটি কাজ করা উচিত।


2

XACML হ'ল সমাধান যা আপনি সত্যই সন্ধান করছেন। এটি একধরণের নিয়ম ইঞ্জিন যা কেবল অ্যাক্সেস নিয়ন্ত্রণে দৃষ্টি নিবদ্ধ করে। ওএএসআইএস দ্বারা সংজ্ঞায়িত একটি স্ট্যান্ডার্ড XACML তিনটি অংশকে সংজ্ঞায়িত করে:

  • একটি আর্কিটেকচার
  • একটি নীতি ভাষা (যা সত্যই আপনি চান)
  • একটি অনুরোধ / প্রতিক্রিয়া প্রকল্প (আপনি কিভাবে অনুমোদনের সিদ্ধান্তের জন্য জিজ্ঞাসা করবেন)।

আর্কিটেকচারটি নিম্নরূপ:

  • পলিসি ডিসিশন পয়েন্ট (পিডিপি) হ'ল স্থাপত্যের মূল অংশ। এটি এমন উপাদান যা নীতিগুলির একটি পরিচিত সেটগুলির বিপরীতে আগত অনুমোদনের অনুরোধগুলির মূল্যায়ন করে
  • পলিসি এনফোর্সমেন্ট পয়েন্ট (পিইপি) হ'ল কোডের অংশ যা আপনার অ্যাপ্লিকেশন / এপিআই / পরিষেবা রক্ষা করে। পিইপি ব্যবসায়িক অনুরোধটিকে বাধা দেয়, এক্সএক্সএমএল অনুমোদনের অনুরোধ তৈরি করে, পিডিপিতে প্রেরণ করে, প্রতিক্রিয়া ফিরে পায় এবং প্রতিক্রিয়ার অভ্যন্তরের সিদ্ধান্তটি কার্যকর করে।
  • পলিসি ইনফরমেশন পয়েন্ট (পিআইপি) হল এমন উপাদান যা পিডিপিকে ডেটার বাইরের উত্সের সাথে সংযুক্ত করতে পারে যেমন একটি এলডিএপি, একটি ডাটাবেস বা একটি ওয়েব পরিষেবা service পিইপি কার্যকর হয় যখন পিইপি একটি অনুরোধ প্রেরণ করে যেমন "" এলিস ডকটি # 12 দেখতে পাচ্ছেন? " এবং PDP এর নীতি রয়েছে যা ব্যবহারকারীর বয়সের প্রয়োজন। পিডিপি পিআইপিকে "আমাকে অ্যালিসের বয়স দিন" জিজ্ঞাসা করবে এবং তারপরে নীতিগুলি প্রক্রিয়া করতে সক্ষম হবে।
  • পলিসি অ্যাডমিনিস্ট্রেশন পয়েন্ট (পিএপি) হ'ল এমন জায়গা যেখানে আপনি সম্পূর্ণ এক্সএসিএমএল সমাধান (বৈশিষ্ট্যগুলি নির্ধারণ, নীতি লেখার, এবং পিডিপি কনফিগারেশন) পরিচালনা করেন।

ই এক্সটেনসিবল অ্যাক্সেস কন্ট্রোল মার্কআপ ল্যাঙ্গুয়েজ - এক্সএএমএল আর্কিটেকচার

আপনার প্রথম ব্যবহারের কেসটি দেখতে এখানে দেখাচ্ছে:

/*
 * All users in department 1 with over 5 years of seniority can VIEW resource FOOBAR-1, else not authorized
 * 
 */
 policy departmentOne{
    target clause department == 1
    apply firstApplicable
    /**
     * All users in department 1 with over 5 years of seniority can VIEW resource FOOBAR-1, else not authorized
     */
    rule allowFooBar1{
        target clause resourceId=="FOOBAR-1" and seniority>=5 and actionId=="VIEW"
        permit
    }
    rule denyOtherAccess{
        deny
    }

 }

আপনার দ্বিতীয় ব্যবহারের কেসটি হ'ল:

 /*
  * "All users in department 2, if the date is after 03/15/2016, can VIEW resource FOOBAR-2, else not authorized"
  *  
  */
  policy departmentTwo{
    target clause department == 1
    apply firstApplicable
    rule allowFooBar2{
        target clause resourceId=="FOOBAR-1" and seniority>=5 and currentDate>"2016/03/15":date and actionId=="VIEW"
        permit
    }
    rule denyOtherAccess{
        deny
    }
  }

আপনি উভয় ব্যবহারের ক্ষেত্রে রেফারেন্স ব্যবহার করে একক নীতিতে একত্রিত করতে পারেন:

  policyset global{
    apply firstApplicable
    departmentOne
    departmentTwo
  }

এবং তুমি করে ফেলেছ!

আপনি এএক্সএএমএমএল এবং এএলএফএ থেকে আরও পড়তে পারেন:


0

আপনি এখানে যা চান তা XACML । এটি আপনাকে যা চান ঠিক তা দেয়। আপনাকে অবশ্যই সমস্ত ভূমিকা পুরোপুরি আলাদা করার সাথে পুরো আর্কিটেকচারটি প্রয়োগ করতে হবে না ... আপনার যদি কেবল একটি একক প্রয়োগ থাকে, আপনি সম্ভবত পিপিপি এবং পিইপিকে আপনার অ্যাপ্লিকেশনটিতে বালানা দিয়ে সংহত করে পালিয়ে যেতে পারেন এবং পিআইপি যা-ই হোক না কেন আপনার বিদ্যমান ব্যবহারকারী ডাটাবেস হয়।

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


1
এই প্রশ্ন জিজ্ঞাসা উত্তর কিভাবে?
gnat

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

0

আমরা আমার বর্তমান সংস্থায় এটি করেছি এবং ফলাফলগুলি নিয়ে আমরা খুব খুশি।

আমাদের এক্সপ্রেশনগুলি জেএস-এ লিখিত আছে এবং আমরা এমনকি এগুলি ব্যবহারের স্থিতিস্থাপক অনুসন্ধান অনুসন্ধান থেকে প্রাপ্ত ফলাফলগুলিকে সীমাবদ্ধ করতে তাদের ব্যবহার করি।

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

কোড ইনজেকশন আক্রমণগুলি নিয়ে আমরা সত্যিই চিন্তিত নই, কারণ অনুমতিগুলি এমনটি লিখেছেন যাদের সিস্টেমে আক্রমণ করার দরকার নেই। এবং এটি while(true)উদাহরণের মতো ডস আক্রমণগুলিতে প্রযোজ্য । সিস্টেমের প্রশাসকদের এগুলি করার দরকার নেই, তারা কেবল সকলের অনুমতি সরিয়ে ফেলতে পারে ...

হালনাগাদ:

কোনও প্রতিষ্ঠানের কেন্দ্রীয় লেখক পরিচালনা পয়েন্ট হিসাবে XACML এর মতো কিছু ভাল বলে মনে হচ্ছে। আমাদের ক্লায়েন্টদের টিপিকভাবে সমস্ত চালানোর জন্য কোনও আইটি বিভাগ নেই বলে আমাদের ব্যবহারের ক্ষেত্রে কিছুটা আলাদা। আমাদের স্ব-অন্তর্ভুক্ত কিছু দরকার তবে যথাসম্ভব নমনীয়তা সংরক্ষণের চেষ্টা করা হয়েছিল।

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