ভূমিকা বনাম অনুমতি ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ


44

যখন অ্যাক্সেস নিয়ন্ত্রণ (অনুমোদন) আসে তখন আমি ভূমিকা এবং অনুমতিগুলির মধ্যে অন্তর্নিহিত ট্রেড অফকে বোঝার চেষ্টা করছি।

এর দিয়ে শুরু করা যাক একটি প্রদত্ত: আমাদের সিস্টেমে, একটি অনুমতির অ্যাক্সেস ( "র সূক্ষ্মাতিসূক্ষ্ম ইউনিট হতে হবে সম্পাদনা রিসোর্স এক্স ", " অ্যাক্সেস ড্যাশবোর্ড পৃষ্ঠা ", ইত্যাদি)। একটি ভূমিকা হ'ল 1+ অনুমতিগুলির সংগ্রহ। একজন ব্যবহারকারীর 1+ ভূমিকা থাকতে পারে। এই সমস্ত সম্পর্ক (ব্যবহারকারী, ভূমিকা, অনুমতি) সমস্তই একটি ডাটাবেসে সঞ্চিত থাকে এবং উড়তে এবং প্রয়োজন অনুসারে পরিবর্তন করা যায়।

আমার উদ্বেগ:

(1) অ্যাক্সেস নিয়ন্ত্রণের জন্য ভূমিকাগুলি পরীক্ষা করা সম্পর্কে এত "খারাপ" কী? পরিবর্তে অনুমতি পরীক্ষা করে কি সুবিধা অর্জন করা হয়? অন্য কথায়, নীচে এই দুটি স্নিপেটের মধ্যে পার্থক্য কী:

if(SecurityUtils.hasRole(user)) {
    // Grant them access to a feature
}

// vs.
if(SecurityUtils.hasPermission(user)) {
    // Grant them access to a feature
}

এবং:

(২) এই দৃশ্যে ভূমিকাগুলি এমনকি কোন কার্যকর মূল্য সরবরাহ করে? আমরা কি সরাসরি ব্যবহারকারীদের 1+ অনুমতি বরাদ্দ করতে পারি না? রোলস বিমূর্তনের কোন কংক্রিট মূল্য সরবরাহ করে (কেউ নির্দিষ্ট উদাহরণ দিতে পারে)?


2
একটি দম্পতি পয়েন্ট: (1) একক ব্যবহারকারীর একাধিক ভূমিকা থাকতে পারে, (২) আপনি এসিএল (অ্যাক্সেস কন্ট্রোল তালিকাগুলি) দেখতে চাইতে পারেন, যেমন eg আপনি "ড্যাশবোর্ড পৃষ্ঠা অ্যাক্সেস" ড্যাশবোর্ড পৃষ্ঠাগুলির কেবলমাত্র একটি উপসেটে (যদি বেশ কয়েকটি থাকে) প্রদান করতে সক্ষম হতে পারেন want
ম্যাথিউ এম।

উত্তর:


62

(1) অ্যাক্সেস নিয়ন্ত্রণের জন্য ভূমিকাগুলি পরীক্ষা করা সম্পর্কে এত "খারাপ" কী? পরিবর্তে অনুমতি পরীক্ষা করে কি সুবিধা অর্জন করা হয়?

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

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

যদি আপনি সরাসরি কল সাইটে ভূমিকার জন্য যাচাই করেন, আপনি স্পষ্টভাবে ভূমিকা নিচ্ছেন ⇄ অনুমতি সম্পর্কিত সম্পর্ক এবং উদ্বেগের বিচ্ছেদ লঙ্ঘন করে কলিং কোডটিতে অনুমোদনের লজিক।

আপনি যদি পরে সিদ্ধান্ত নিতে চান যে ভূমিকার fooঅনুমতি না থাকা উচিত baz, আপনাকে প্রতিটি কোড পরিবর্তন করতে হবে যা ব্যবহারকারী যদি একটি হয় কিনা তা যাচাই করে foo

(২) এই দৃশ্যে ভূমিকাগুলি এমনকি কোন কার্যকর মূল্য সরবরাহ করে? আমরা কি সরাসরি ব্যবহারকারীদের 1+ অনুমতি বরাদ্দ করতে পারি না? রোলস বিমূর্তনের কোন কংক্রিট মূল্য সরবরাহ করে (কেউ নির্দিষ্ট উদাহরণ দিতে পারে)?

ভূমিকাগুলি নামমাত্র অনুমতির সংগ্রহের প্রতিনিধিত্ব করে।

ধরা যাক আপনি একটি নতুন বৈশিষ্ট্য যুক্ত করছেন যা ব্যবহারকারীর নির্দিষ্ট কিছু সেটিংস সম্পাদনা করতে দেয়। এই বৈশিষ্ট্যটি কেবল প্রশাসকদের জন্য উপলব্ধ হওয়া উচিত।

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

আপনি যদি ভূমিকাগুলি ব্যবহার করেন তবে আপনাকে কেবল ভূমিকার জন্য অনুমতিটি সংযোজন Administratorকরতে হবে, যা উভয়ই সম্পাদন করা সহজ, আরও বেশি স্থান দক্ষ এবং ভুলের ঝুঁকিতে কম।


উহ? প্রমাণীকরণ স্তর চেক করবে ব্যবহারকারী সেই একমাত্র যারা বলে দাবি; যে স্তরটি কোন ফাংশন / ডেটা যেমন কোনও ব্যবহারকারীর অ্যাক্সেস করতে পারে তা যাচাই করে সেটি হ'ল অনুমোদনের স্তর
SJuan76

4
এটি সমস্ত প্রোগ্রামারদের জন্য বাধ্যতামূলক পড়া উচিত। চমৎকার।
Kosta Kontos

2
সহজ, সংক্ষিপ্ত এবং মূল বিষয় - কোথাও কোনও বইয়ের পুরো অধ্যায়কে মারধর করে। ধন্যবাদ।
ড্যান নিসেনবাউম

2
স্পষ্টতার জন্য মন্তব্য করুন (এবং দয়া করে আমাকে ভুল করে দিলে আমাকে সংশোধন করুন): authorization layerসম্ভবত ফাংশনটির সংজ্ঞা থাকা (যেমন) user->hasPermission(SOME_PERMISSION)অভ্যন্তরীণভাবে প্রথমে ব্যবহারকারীর ভূমিকাগুলি পরীক্ষা করে তারপরে কোনও ভূমিকাটি অন্তর্ভুক্ত / বাদ দিয়ে কিনা তা পরীক্ষা করে দেখুন অনুমতি নেই। উদাহরণস্বরূপ, the calling codeযদি একটি নির্দিষ্ট পৃষ্ঠা ব্যবহারকারীর জন্য দৃশ্যমান এবং কল করবে চেক করে দেখতে হতে পারে user->hasPermission(VIEW_GIVEN_PAGE), এবং authorization layerগঠিত সংজ্ঞা এর hasPermissionফাংশন যার উপরে যেমন ভূমিকা পরীক্ষা করে।
ড্যান নিসেনবাউম

1
@ ড্যানিসিসনবাউম হ্যাঁ, আপনি এটি ঠিক মতো পেয়েছেন বলে মনে হচ্ছে, এটি কেবল ব্যবহারকারীদের ভূমিকাতে এই অনুমোদন রয়েছে কিনা তা যাচাই করা যত সহজ। এটি এর চেয়েও বেশি হতে পারে। উদাহরণস্বরূপ, সম্ভবত আপনার কাছে কোনও ব্যবহারকারীকে সাময়িকভাবে স্থগিত করার বিকল্প রয়েছে এবং সে ক্ষেত্রে hasPermissionএটি পরীক্ষা করতে পারে usersRole.HasPermission(VIEW_GIVEN_PAGE) && !user.Suspended। মুল বক্তব্যটি হ'ল এগুলি সবই এক জায়গায় করা হয় এবং গ্রাহক (কলিং) কোডে নয়।
রোটেম

18

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

if(SecurityUtils.hasRole(developer)) {
    // Grant them access to a feature
} else if(SecurityUtils.hasRole(manager)) {
    // Grant them access to a feature
} else if...

( switchআপনার পছন্দের ভাষাতে একটি বিবৃতি আরও ভাল হবে, তবে এখনও বিশেষভাবে পরিচ্ছন্ন নয়)

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

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

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

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


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