ব্যবহারকারীর অনুমতি সহ মেনু আইটেমগুলি সংরক্ষণ করা


11

আমি পিএইচপি এবং মাইএসকিউএল একটি মেনু সিস্টেম তৈরি করছি। আমার বেশ কয়েকটি আলাদা মেনু থাকবে এবং প্রতিটি মেনুতে এটির সাথে মেনু আইটেমগুলির একটি সেট সংযুক্ত থাকবে।

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

আমার এতদূর যা কিছু আছে তা হ'ল:

-------------------
|Menus
-------------------
|id| |display name|
-------------------

----------------------------------------------------------
|Menu items
----------------------------------------------------------
|id| |menu_id| |label| |link| |parent| |sort| |permission|
----------------------------------------------------------

আমি ভাবছি যে permissionকলামটি কমা দ্বারা বিযুক্ত স্ট্রিং হতে পারে যা আমি বর্তমান ব্যবহারকারীর অনুমতি আইডির বিপরীতে মেলে match এটি অন্য কয়েকটি টেবিলের একটি রেফারেন্সও হতে পারে যা বর্তমানে বিদ্যমান অনুমতিগুলির সমস্ত সম্ভাব্য সংমিশ্রণকে সংজ্ঞায়িত করে।

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

আমি কীভাবে এটি কাঠামোবদ্ধ করব এবং কী পরিষ্কার, গতিশীল এবং কৃপণ বলে বিবেচিত হতে পারে সে সম্পর্কে কিছু চিন্তা শুনতে শুনতে আমি পছন্দ করি।

ধন্যবাদ।


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

1
আপনি এখানে অনেক ভাল উত্তর পাচ্ছেন, তবে আপনি যা পড়তে চাইতে পারেন তা এসিএল। en.wikipedia.org/wiki/Access_control_list
Reactgular

উত্তর:


18

আমি এটি ER ডায়াগ্রাম ব্যবহার করে মডেল করব।

  • PERMISSIONহ'ল ROLEএকটি প্রদত্ত অ্যাক্সেস MENU_ITEM
  • একটি রোল পূর্বনির্ধারিত অনুমতিগুলির একটি সেট যা একটি নাম দেওয়া হয়
  • একজন USERঅনেক এটা মঞ্জুর ভূমিকা থাকতে পারে।
  • ব্যবহারকারীর পরিবর্তে ভূমিকার জন্য অনুমতি বরাদ্দ করা, অনুমতিগুলি পরিচালনা করা আরও সহজ করে তোলে।

এখানে চিত্র বর্ণনা লিখুন

তারপরে আপনি একটি ভিউ তৈরি করতে পারবেন যাতে আপনাকে প্রতিবার যোগদান হতে হবে না:

create or replace view v_user_permissions
select
    distinct mi.id, mi.menu_id. mi.label. mi.link, mi.parent, mi.sort, u.user_id
from
    user u
    join user_role ur on (u.user_id = ur.user_id)
    join role ro on (ur.role_id = role.role_id)
    join permission per on (ro.role_id = per.role_id)
    join menu_item mi on (per.metu_item_id = mi.metu_item_id)

তারপরে আপনি যখনই জানতে পারবেন কোনও ব্যবহারকারীর কী মেনু আইটেমের অ্যাক্সেস রয়েছে তা আপনি এটি জিজ্ঞাসা করতে পারেন:

select * from v_user_permissions up where up.user_id = 12736 order by up.sort

সম্পাদনা করুন:

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


অান্তরিক ধন্যবাদ. আমি নিজে কেন এটি আঁকতে পারি না তা দেখতে পাচ্ছি না। কেমনে আমি ব্লক এবং অ অভিজ্ঞ :) ছিল
বিঘত

হ্যাঁ, আমি ভেবেছিলাম আমি বুঝতে পেরেছি তবে স্পষ্টতই তা হয়নি। আমি কীভাবে একটি একক মেনু আইটেমের জন্য একাধিক অনুমতি পেতে পারি?
স্প্যান

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

ধন্যবাদ, আমি আপনার উত্তর না পাওয়া পর্যন্ত আমি পড়তে যাব;)। আমি মনে করি যে আমার ভুলটি ভেবেছিল যে মেনু আইটেমগুলি পৃথক করতে ভূমিকাটির সাথে একক অনুমতি ব্যবহার করা যেতে পারে। মনে হচ্ছে মেনু আইটেমের প্রতিটি 'টাইপ' এর জন্য আমার অনুমতি দরকার। আবার, আপনার সাহায্যের জন্য ধন্যবাদ! আমি কিছু ভেন চিত্র আঁকা এবং যদি আমি সঠিকভাবে \ ণ / এটি প্রায় আমার মাথা পেতে পারেন দেখতে পাবেন
বিঘত

5

কমা বিচ্ছিন্ন তালিকা থাকা মানে প্রতিবার মেনুর বিপরীতে কোনও জিজ্ঞাসা করার সময় একটি স্ট্রিং তুলনা করা। এটি আদর্শের চেয়ে কম।

আপনার টেবিলটি স্বাভাবিক করতে হবে:

---------------------------------------------
|Menu items
---------------------------------------------
|id| |menu_id| |label| |link| |parent| |sort|
---------------------------------------------

+---------------------------+
| menu_permission           |
|---------------------------|
| |menu_permission_id| (pk) |
| |menu_id| (fk)            |
| |permission|              |
+---------------------------+

আপনি যদি এখনও কমা দিয়ে পৃথক করা তালিকা (কিছু কারণে) চান, আপনি এটা জিনিস দিয়ে যেমন টান করতে পারেন group_concatমধ্যে MySQL wm_concat মধ্যে ওরাকল বা অন্যান্য ভাষায় অনুরূপ ফাংশন।

এর জন্য সুবিধাটি বহুগুণে।

প্রথমত, কলটির কার্যকারিতা রয়েছে। একটি ইচ্ছাকৃতভাবে বড় স্ট্রিংয়ের বিপরীতে স্ট্রিং করা (যদি আপনি এটির আকার ঠিক করেন তবে স্ট্রিংটি পূরণ করার পরে আপনার সমস্যা হতে পারে যাতে আপনি aতার পরিবর্তে অনুমতি পেতে শুরু করেন another_permission) অর্থ প্রতিটি সারিতে স্ট্রিংটি স্ক্যান করা। এটি এমন কিছু নয় যা ডেটাবেসগুলির জন্য অপ্টিমাইজড।

দ্বিতীয়ত, আপনি যে ক্যোয়ারী লিখেছেন তা অনেক সহজ হয়ে যায়। কমা দ্বারা বিচ্ছিন্ন তালিকায় অনুমতি 'foo' উপস্থিত রয়েছে কিনা তা নির্ধারণ করার জন্য আপনাকে 'foo' পরীক্ষা করতে হবে।

... permission like "%foo%" ...

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

... permission like "%,foo,%" ...

তবে 'foo' স্ট্রিংয়ের শুরু বা শেষের দিকে থাকলে এটি একটি মিথ্যা নেতিবাচক দেয়। যা এরকম কিছু বাড়ে

... (permission like "foo,%" 
  or permission like "%,foo,%" 
  or permission like "%,foo" ) ...

আপনি নোট করবেন যে এটি সম্ভবত সম্ভবত আপনার স্ট্রিংয়ের একাধিক স্ক্যান করতে হবে। এই পথ পাগলামি বাড়ে।

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

ক্ষেত্রটি স্বাভাবিক করা আপনাকে আপনার ডাটাবেসে অনেক বেশি নমনীয়তা এবং স্বচ্ছলতা দেয়। আপনি আফসোস করবেন না।


আপনার দুর্দান্ত উত্তরের জন্য আপনাকে ধন্যবাদ, এটি আমাকে আরও জ্ঞান দিয়েছে এবং আমি তার জন্য দুর্দান্ত তবে যদিও আমি মনে করি ব্যবহারকারী 61852 সমাধানটি আপাতত সবচেয়ে উপযুক্ত হবে।
বিঘত

3

এই যে শাস্ত্রীয় পন্থা User -> UserGroupএবং তারপর একটি যুক্ত Menu -> MenuItem -> UserGroup। অনুমতি স্তর ওজন করতে একটি পূর্ণসংখ্যার মান ব্যবহার করে।

-------------------
|Menu
-------------------
|id| |display name|
-------------------

-------------------------------------------------------------
|Menu Item
-------------------------------------------------------------
|id| |menu_id| |label| |link| |parent| |sort| | min_option1
-------------------------------------------------------------

-------------------------------------------
| User
-------------------------------------------
|id| | username | password | user_group_id
-------------------------------------------

-------------------------------------------
| User Group
-------------------------------------------
|id| option1 | option2 | option2
-------------------------------------------

যখন আপনাকে বর্তমান ব্যবহারকারীর জন্য একটি মেনু প্রদর্শন করতে হবে। আপনি এই জাতীয় ডাটাবেস জিজ্ঞাসা করতে পারেন।

SELECT * FROM `MenuItem`
    LEFT JOIN `UserGroup` ON (`MenuItem`.`user_group_id` = `UserGroup`.`id`)
    LEFT JOIN `User` ON (`UserGroup`.`id` = `User`.`user_group_id` AND `User`.`id` = $current_user_id)
        WHERE `MenuItem`.`menu_id` = $menu_id AND `UserGroup`.`option1` >= `MenuItem`.`min_option1`;

এটি কেবলমাত্র এমন মেনু নির্বাচন করবে যা শর্ত অনুসারে বর্তমান ব্যবহারকারীর কাছে দৃশ্যমান option1

বিকল্পভাবে, আপনি যদি বর্তমান সেশনে বর্তমান ব্যবহারকারীর গোষ্ঠী বিশদটি সঞ্চয় করেন তবে কোনও যোগদানের প্রয়োজন নেই।

SELECT * FROM `MenuItem` WHERE `MenuItem`.`menu_id` = $menu_id AND `MenuItem`.`min_option1` >= $user_group_option1;

যখন আপনি মেনু আইটেম প্রতি একাধিক অনুমতি সঞ্চয় করতে চান সম্পর্কে কথা বলতে। আমি ব্যবহারকারীর ভূমিকা এবং ব্যবসায়ের যুক্তিগুলিকে বিভ্রান্ত না করার বিষয়ে সতর্ক থাকব।


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

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

@ ম্যাথিউফসাকারিনী কোনও উদ্বেগ নেই, যতক্ষণ না কোনও কোডবেস ধারাবাহিকতা
এড জেমস

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