ব্যবহারকারীর একটি নির্দিষ্ট পৃষ্ঠায় অ্যাক্সেস আছে কিনা তা পরীক্ষা করুন


23

কোনও ব্যবহারকারীকে নির্দিষ্ট পৃষ্ঠায় অ্যাক্সেসের অনুমতি আছে কিনা তা আমি কীভাবে নির্ধারণ করতে পারি?


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

উত্তর:


25

আপনি যদি লগ ইন থাকা ব্যবহারকারীটির কোনও পৃষ্ঠায় অ্যাক্সেস আছে কিনা তা যাচাই করতে চান, আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

if ($router_item = menu_get_item($path)) {
  if ($router_item['access']) {
    // The user has access to the page in $path.
  }
}

$path আপনি যে পৃষ্ঠার চেক করতে চান তার পন্থা (উদাঃ নোড / 1, প্রশাসক / ব্যবহারকারী / ব্যবহারকারী)।

কোডটি ড্রুপাল 6 এবং উচ্চতর সংস্করণগুলিতে কাজ করে এবং এটি মেনু_এক্সেকিউট_একটিভ_হ্যান্ডলার () থেকে ব্যবহৃত হয় ।

আমি অ্যাক্সেস কলব্যাককে সরাসরি কল করার পরামর্শ দিচ্ছি না কারণ কারণগুলি যে ফাংশনে প্রেরণ করা দরকার।

_মেনু_চেক_এ্যাক্সেস () দ্বারা ব্যবহৃত কোডটি নিম্নলিখিতটি (দ্রুপাল)):

$arguments = menu_unserialize($item['access_arguments'], $map);
// As call_user_func_array is quite slow and user_access is a very common
// callback, it is worth making a special case for it.
if ($callback == 'user_access') {
  $item['access'] = (count($arguments) == 1) ? user_access($arguments[0]) : user_access($arguments[0], $arguments[1]);
}
elseif (function_exists($callback)) {
  $item['access'] = call_user_func_array($callback, $arguments);
}

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

$items['node/add/' . $type_url_str] = array(
  'title' => $type->name, 
  'title callback' => 'check_plain', 
  'page callback' => 'node_add', 
  'page arguments' => array($type->type), 
  'access callback' => 'node_access', 
  'access arguments' => array('create', $type->type), 
  'description' => $type->description, 
  'file' => 'node.pages.inc',
);

$items['node/%node'] = array(
  'title callback' => 'node_page_title', 
  'title arguments' => array(1),
  // The page callback also invokes drupal_set_title() in case
  // the menu router's title is overridden by a menu link. 
  'page callback' => 'node_page_view', 
  'page arguments' => array(1), 
  'access callback' => 'node_access', 
  'access arguments' => array('view', 1),
);

উভয় সংজ্ঞায়, অ্যাক্সেস আর্গুমেন্টগুলিতে কোনও ব্যবহারকারীর অবজেক্ট এবং নোড_এ্যাক্সেস () বর্তমানে অন্তর্ভুক্ত থাকা ব্যবহারকারীদের জন্য ব্যবহারকারীর অবজেক্টকে অন্তর্ভুক্ত করে না। দ্বিতীয় ক্ষেত্রে আর্গুমেন্টের একটি হ'ল নোড অবজেক্ট যা ইউআরএল থেকে প্রাপ্ত; উদাহরণস্বরূপ, URL টি যদি URL.com/node/1 হয় তবে অ্যাক্সেস কলব্যাকটিতে দ্বিতীয় আর্গুমেন্টটি নোড আইডি সমান নোডের জন্য নোড অবজেক্টটি 1 এর সমান হয়
hand ইতিমধ্যে দ্রুপালে বিদ্যমান। এমনকি আপনি যদি সেই কোডটি নকল করে ফেলেন, তবুও অ্যাক্সেস কলব্যাকগুলির সমস্যা রয়েছে যা বর্তমানে লগ ইন থাকা ব্যবহারকারীর বিরুদ্ধে অ্যাক্সেসটি চেক করছে।

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


এই কোডটি কোন হুকটিতে লেখা উচিত তা আমি জানতে পারি।
গ্ল্যাডিয়েটর

14

ব্যবহার করে দেখুন drupal_valid_path ()

ফাংশনটি ফেরত TRUEহ'ল যুক্তিটি বিদ্যমান থাকার সাথে সাথে পাস করা পথ এবং বর্তমান ব্যবহারকারীর এতে অ্যাক্সেস রয়েছে। সুতরাং, আপনি যদি ড্রুপাল 7-এ কাজ করছেন এবং আপনার বর্তমানে লগ ইন করা ব্যবহারকারীর অ্যাক্সেস পরীক্ষা করতে হবে তবে এটি যাওয়ার সহজ উপায়:

if (drupal_valid_path('my/path')) {
  // Your code here...
}

1
ডি 7-তে, drupal_valid_pathপুরোপুরি কাজটি করে এবং এই সঠিক প্রয়োজনীয়তাটি তৈরি করার জন্য তৈরি করা হয়। এটি মেনু_জেট_টিম ব্যবহার করে এবং অ্যাক্সেসও পরীক্ষা করে।
ওয়েবোয়েড

এটি সত্য, তবে এটি কেবল বর্তমানে লগ-ইন করা ব্যবহারকারীর জন্য কাজ করে। যদি আপনি জানতে চান যে অন্য কোনও ব্যবহারকারীর পাথ অ্যাক্সেস drupal_valid_pathকরতে পারে তবে আপনাকে সাহায্য করবে না।
অ্যান্ড্রু শুলম্যান

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

ড্রুপাল 8-এ, এ স্থানান্তরিত হয়েছে \Drupal::service('path.validator')->isValid($path);- এপিআই ডকুমেন্টেশন দেখুন
গোগোভিটশ

3

access callbackপৃষ্ঠার জন্য দায়ী যে মেনু এন্ট্রিতে নির্দিষ্ট করা আছে তাকে কল করুন । সেই মেনু এন্ট্রিটি সাধারণত দ্রুপাল বাস্তবায়নের কল করে hook_menuএবং ডেটাবেসের কোথাও সঞ্চিত থাকে। সতর্ক থাকুন যে ফিরিয়ে দেওয়া ডেটা hook_menuমডিউল প্রয়োগকারী দ্বারা পরিবর্তিত হতে পারে hook_menu_alter

সাবধান থাকুন যে কিছু মডিউল ব্যবহারকারীকে পৃথক যুক্তি ( access argumentsমেনু প্রবেশের কী দ্বারা সুনির্দিষ্ট হিসাবে) হিসাবে পাস করবে না , তবে পরিবর্তে এটি বৈশ্বিক $userঅবজেক্টটি ব্যবহার করতে পারে । আপনার ব্যবহৃত প্রতিটি মডিউলটির জন্য আপনাকে এটি পরীক্ষা করতে হবে।


এই পদ্ধতিটি ব্যবহারকারীর ব্যবহার ব্যতীত অন্য কোনও ব্যবহারকারীকে পৃষ্ঠাটিতে অ্যাক্সেস করার অনুমতি দেওয়া হয়েছে কিনা তা খুঁজে বের করতে ব্যবহার করা যেতে পারে।
ওসওয়াল্ড

1
অ্যাক্সেস কলব্যাক কল করা অন্য কোনও ফাংশন কল করার মতো সহজ নয়, যেমন অ্যাক্সেস কলব্যাকের নির্দিষ্ট যুক্তিগুলির প্রয়োজন; _menu_check_access () দেখুন যা বর্তমানে এটি লগইন হওয়া ব্যবহারকারীদের কোনও মেনুতে অ্যাক্সেস রয়েছে কিনা তা যাচাই করে এমন ফাংশন।
কিমলালুনো

2

user_access()ফাংশনটি পরীক্ষা করে দেখুন । দ্রুপালের প্রতিটি সংস্করণের জন্য নির্দিষ্ট পরামিতিগুলির লিঙ্কটি দেখুন। দ্রুপাল 7-8 এর জন্য ডকুমেন্টেশন পৃষ্ঠা থেকে:

পরামিতি

$ স্ট্রিং অনুমতি, যেমন "প্রশাসক নোডগুলি" যাচাই করা হচ্ছে।

$ অ্যাকাউন্ট (alচ্ছিক) অ্যাকাউন্টটি চেক করার জন্য, যদি দেওয়া না হয় তবে বর্তমানে ব্যবহারকারীর লগইন হয়েছে।

ফেরত মূল্য

বুলিয়ান সত্য যদি বর্তমান ব্যবহারকারীর কাছে অনুরোধের অনুমতি থাকে।

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


ব্যবহারকারীর_অ্যাক্সেস () ব্যবহারকারীর একটি নির্দিষ্ট "ধরণের" অনুমতি রয়েছে কিনা তা যাচাই করার জন্য। প্রয়োজনটি হ'ল যদি ব্যবহারকারী কোনও নির্দিষ্ট "পথে" অ্যাক্সেস করতে পারে; উদাহরণস্বরূপ, যদি ব্যবহারকারী 'নোড / 12' অ্যাক্সেস করতে পারেন?
ফরজান

আচ্ছা আপনি কীভাবে নির্ধারণ করছেন যখন কোনও ব্যবহারকারীর অনুমতি আছে বা নেই তখন? আমি ধরে নেব অনুমতি পৃষ্ঠাতে এমন একটি বিকল্প রয়েছে যা আপনি হয় যাচাই করেছেন বা নির্দিষ্ট কিছু ভূমিকা অনুমতি না দেওয়ার জন্য
লক্ষ্মণ 13

user_access()মেনু দ্বারা ব্যবহৃত অ্যাক্সেস কলব্যাক সবসময় নয়; এমনকি এটি হ'ল, আপনার যে অ্যাক্সেস আর্গুমেন্টগুলি পাস করতে হবে তা আপনার জানা উচিত user_access()
কিমলালুনো

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

যদিও ব্যবহারকারী_স্যাক্সেস কোনও নির্দিষ্ট পাথের অ্যাক্সেস চেক করতে পারে না, আমি মনে করি যখনই সম্ভব সম্ভব ব্যবহারকারীর_অ্যাক্সেস ব্যবহার করা অ্যাক্সেস চেক করার সর্বোত্তম উপায়। ভাল উত্তর @ লক্ষ্মণ 13 +1।
আয়ুষ্ক

2

যদি কোনও ব্যবহারকারী কোনও নির্দিষ্ট নোড অ্যাক্সেস করতে পারে এবং কোনও নোড অ্যাক্সেস মডিউল ব্যবহার করছে কিনা আপনার যদি জানতে হবে তবে আপনি নোড_একসেস () ব্যবহার করতে পারেন । (নোড অ্যাক্সেস মডিউল ছাড়াই তাদের কেবল 'অ্যাক্সেস সামগ্রী' অনুমতি প্রয়োজন))

যদি আপনি কোনও ব্যবহারকারী কোনও হুক_মেনু () প্রয়োগের মাধ্যমে সংজ্ঞায়িত একটি নির্বিচার পাথে অ্যাক্সেস করতে পারেন তা যদি জানতে চান তবে আপনাকে ডাটাবেস থেকে মেনু এন্ট্রিটি পুনরুদ্ধার করতে হবে এবং এর 'অ্যাক্সেস কলব্যাক' পরামিতিটি মূল্যায়ন করতে হবে।


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