কোনও ব্যবহারকারীকে নির্দিষ্ট পৃষ্ঠায় অ্যাক্সেসের অনুমতি আছে কিনা তা আমি কীভাবে নির্ধারণ করতে পারি?
কোনও ব্যবহারকারীকে নির্দিষ্ট পৃষ্ঠায় অ্যাক্সেসের অনুমতি আছে কিনা তা আমি কীভাবে নির্ধারণ করতে পারি?
উত্তর:
আপনি যদি লগ ইন থাকা ব্যবহারকারীটির কোনও পৃষ্ঠায় অ্যাক্সেস আছে কিনা তা যাচাই করতে চান, আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:
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
, আপনি দেখতে পারেন প্রোগ্রামেটিক্যালি থেকে লগ আউট করা ঘটাচ্ছে ব্যবহারকারী লগ-বর্তমানে ছাড়া অন্য ব্যবহারকারী ছদ্মবেশ ধারণ । পার্থক্যটি হ'ল, দ্রুপাল_অনামাস_স্বরূপ () থেকে ফিরে আসা মানটি ব্যবহার করার পরিবর্তে আপনি ব্যবহারকারীর লোড () থেকে প্রাপ্ত মানটি ব্যবহার করেন ।
ব্যবহার করে দেখুন drupal_valid_path () ।
ফাংশনটি ফেরত TRUE
হ'ল যুক্তিটি বিদ্যমান থাকার সাথে সাথে পাস করা পথ এবং বর্তমান ব্যবহারকারীর এতে অ্যাক্সেস রয়েছে। সুতরাং, আপনি যদি ড্রুপাল 7-এ কাজ করছেন এবং আপনার বর্তমানে লগ ইন করা ব্যবহারকারীর অ্যাক্সেস পরীক্ষা করতে হবে তবে এটি যাওয়ার সহজ উপায়:
if (drupal_valid_path('my/path')) {
// Your code here...
}
drupal_valid_path
পুরোপুরি কাজটি করে এবং এই সঠিক প্রয়োজনীয়তাটি তৈরি করার জন্য তৈরি করা হয়। এটি মেনু_জেট_টিম ব্যবহার করে এবং অ্যাক্সেসও পরীক্ষা করে।
drupal_valid_path
করতে পারে তবে আপনাকে সাহায্য করবে না।
\Drupal::service('path.validator')->isValid($path);
- এপিআই ডকুমেন্টেশন দেখুন
access callback
পৃষ্ঠার জন্য দায়ী যে মেনু এন্ট্রিতে নির্দিষ্ট করা আছে তাকে কল করুন । সেই মেনু এন্ট্রিটি সাধারণত দ্রুপাল বাস্তবায়নের কল করে hook_menu
এবং ডেটাবেসের কোথাও সঞ্চিত থাকে। সতর্ক থাকুন যে ফিরিয়ে দেওয়া ডেটা hook_menu
মডিউল প্রয়োগকারী দ্বারা পরিবর্তিত হতে পারে hook_menu_alter
।
সাবধান থাকুন যে কিছু মডিউল ব্যবহারকারীকে পৃথক যুক্তি ( access arguments
মেনু প্রবেশের কী দ্বারা সুনির্দিষ্ট হিসাবে) হিসাবে পাস করবে না , তবে পরিবর্তে এটি বৈশ্বিক $user
অবজেক্টটি ব্যবহার করতে পারে । আপনার ব্যবহৃত প্রতিটি মডিউলটির জন্য আপনাকে এটি পরীক্ষা করতে হবে।
user_access()
ফাংশনটি পরীক্ষা করে দেখুন । দ্রুপালের প্রতিটি সংস্করণের জন্য নির্দিষ্ট পরামিতিগুলির লিঙ্কটি দেখুন। দ্রুপাল 7-8 এর জন্য ডকুমেন্টেশন পৃষ্ঠা থেকে:
পরামিতি
$ স্ট্রিং অনুমতি, যেমন "প্রশাসক নোডগুলি" যাচাই করা হচ্ছে।
$ অ্যাকাউন্ট (alচ্ছিক) অ্যাকাউন্টটি চেক করার জন্য, যদি দেওয়া না হয় তবে বর্তমানে ব্যবহারকারীর লগইন হয়েছে।
ফেরত মূল্য
বুলিয়ান সত্য যদি বর্তমান ব্যবহারকারীর কাছে অনুরোধের অনুমতি থাকে।
দ্রুপাল সমস্ত অনুমতি চেক এই ফাংশন মাধ্যমে করা উচিত। এইভাবে, আমরা সামঞ্জস্যপূর্ণ আচরণের গ্যারান্টি দিচ্ছি, এবং সুপারিশকারী সমস্ত ক্রিয়া সম্পাদন করতে পারে তা নিশ্চিত করি।
user_access()
মেনু দ্বারা ব্যবহৃত অ্যাক্সেস কলব্যাক সবসময় নয়; এমনকি এটি হ'ল, আপনার যে অ্যাক্সেস আর্গুমেন্টগুলি পাস করতে হবে তা আপনার জানা উচিত user_access()
।
user_access()
, কেবল অনুগ্রহ করে ওপির ব্যবহারকারীর অ্যাক্সেস থাকা উচিত কিনা তা যাচাই করার জন্য তার মনে অনুমতি ছিল। খুব বর্ণনামূলক প্রশ্ন নয়
যদি কোনও ব্যবহারকারী কোনও নির্দিষ্ট নোড অ্যাক্সেস করতে পারে এবং কোনও নোড অ্যাক্সেস মডিউল ব্যবহার করছে কিনা আপনার যদি জানতে হবে তবে আপনি নোড_একসেস () ব্যবহার করতে পারেন । (নোড অ্যাক্সেস মডিউল ছাড়াই তাদের কেবল 'অ্যাক্সেস সামগ্রী' অনুমতি প্রয়োজন))
যদি আপনি কোনও ব্যবহারকারী কোনও হুক_মেনু () প্রয়োগের মাধ্যমে সংজ্ঞায়িত একটি নির্বিচার পাথে অ্যাক্সেস করতে পারেন তা যদি জানতে চান তবে আপনাকে ডাটাবেস থেকে মেনু এন্ট্রিটি পুনরুদ্ধার করতে হবে এবং এর 'অ্যাক্সেস কলব্যাক' পরামিতিটি মূল্যায়ন করতে হবে।
$node = node_load(123);
$account = user_load(456);
if (node_access("update", $node, $account) === TRUE)
{
print "access";
}