আমি কীভাবে প্রোগ্রামটিতে কোনও ব্যবহারকারীর লগ ইন করব?


41

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

পরিষ্কার করার জন্য, আমি একটি এজেএক্স লগইন বাক্সটি তৈরি করার চেষ্টা করছি যা হোম পৃষ্ঠায় একটি পপআপ হিসাবে উপস্থিত হবে এবং ভুল শংসাপত্রের ক্ষেত্রে পৃষ্ঠাটি রিফ্রেশ করবেন না, তবে লগইনটি সঠিক হলেই। এখন পর্যন্ত আমি যা করেছি তা এখানে:

হালনাগাদ

আমি এখন আমার হোমপেজে লগইন ফর্মটি লোড করি, তারপরে জমা দেওয়ার পরে আমি একটি এজেএক্স অনুরোধ চালু করি যা এই স্ক্রিপ্টটিতে শংসাপত্র প্রেরণ করে:

function user_login_submit_try() {
  global $user;  

  $uid = user_authenticate($_POST['name'],$_POST['pass']);    
  $arr = array ('name'=>$_POST['name'],'pass'=>$_POST['pass']);
  if ($uid){
    $user = user_load($uid);
    user_login_finalize($arr);
  }

  echo drupal_json_encode($uid); 
  exit;
}; 

এখন পর্যন্ত এটি কাজ করে, তবে আমার উদ্বেগগুলি (গুগলরপ দ্বারা উল্লিখিত) সুরক্ষা সমস্যাগুলি; দেখে মনে হচ্ছে যে আমি এই স্ক্রিপ্টটিতে যে এপিআই ব্যবহার করেছি সেগুলির কোনওই ডেটা স্যানিটাইজ করে নি।

কেউ কি এর থেকে আরও ভাল উপায় দেখতে পাবে?


কোন কারণে আপনাকে ব্যবহারকারীর নাম এবং পাসওয়ার্ড ব্যবহার করে কোড থেকে কোনও ব্যবহারকারীকে লগ ইন করতে হবে?
কিমলালুনো

@ কিমলালুনো কারণ আমার লগইন ফর্মটিতে এজ্যাক্স ব্যবহার করা দরকার। আমার পূর্ববর্তী প্রশ্নগুলিতে: drupal.stackexchange.com/questions/5780/… drupal.stackexchange.com/questions/5781/… আমি এই দুটি সমস্যার কোনও সমাধান করতে পারি নি তাই আমি কাস্টম এজ্যাক্স অনুরোধের জন্য গিয়েছিলাম।
সিল্কএডমিন

উত্তর:


33

এটি কাউকে সাহায্য করতে পারে:

function mymodule_user_login_credentials($username, $password)
{
    if(user_authenticate($username, $password))
    {
      $user_obj = user_load_by_name($username);
      $form_state = array();
      $form_state['uid'] = $user_obj->uid;      
      user_login_submit(array(), $form_state);
      return true;
    }
    else
    {
        return false;
    }
}

মন্তব্যের উপর ভিত্তি করে আরও ভাল সংস্করণ:

function mymodule_user_login_credentials($username, $password)
{
    if($uid = user_authenticate($username, $password))
    {
      user_login_submit(array(), array('uid' => $uid));
      return true;
    }
    else
    {
        return false;
    }
}

3
user_authenticate ইতিমধ্যে returns uid প্রদান করে যাতে ব্যবহারকারীর বস্তুটি লোড করার প্রয়োজন নেই;)
ফ্লাই করুন

7
দ্বিতীয় কোড ব্লকটি কাজ করবে না; ব্যবহারকারী_লগিন_স্ম্বিতের দ্বিতীয় আর্গ রেফ দ্বারা পাস করা হয়েছে; এটি পাস করলে অ্যারের আউটপুট () ব্যর্থ হবে।
শন কন কান

কোনও রেজিস্ট্রেশন ফর্ম ব্যবহার করে কোনও ব্যবহারকারী তৈরি করার পরে এই উত্তরটি কীভাবে অটো-লগিন করতে ব্যবহৃত হবে? আমি এটি করতে চাই, তবে পাসওয়ার্ডটি হ্যাশ হয় যখন অ্যাকাউন্ট অবজেক্টের মাধ্যমে প্যারামিটার হিসাবে সরবরাহ করা হয় hook_user_insertতবে উত্তরের উপরের ফাংশনগুলি পাসওয়ার্ডটি মূল প্লেইনটিকে মূল প্লেট হিসাবে চায় want আমি অনুমান করি এর hook_form_alterপরিবর্তে আমার চেষ্টা করা দরকার ...
থেরোবিউন

নতুন ব্যবহারকারী তৈরি হওয়ার পরে লোকেরা সরাসরি স্বয়ংক্রিয় লগইন সন্ধানের জন্য
therobyouknow

19

এর জন্য কোনও সাধারণ এপিআই ফাংশন নেই।

ড্রুপাল যা করে তা আপনি করতে পারেন:

  1. ডাটাবেসটি জিজ্ঞাসা করে পাসওয়ার্ডটি পরীক্ষা করুন দেখুন:

ব্যবহারকারী_লগিন_নাম_যুক্তি () ব্যবহারকারী_লগিন_অথেক্যান্টিকেট_অলডিয়েট
() ব্যবহারকারী_লগিন_ফাইনাল_অলিয়েড
()

  1. ওভাররাইট global $user

    global $user;
    $user = user_load($uid);
  2. সেশনগুলি হ্যান্ডেল করুন

user_login_finalize($form_state);

দ্বিতীয় এবং 3 পদক্ষেপের জন্য দেখুন user_login_submit()

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


ধন্যবাদ গুগলরপ, আমি চেষ্টা করব, যদিও এটি আমাকে এই কাজগুলি কীভাবে এক সাথে কাজ করে তা নিয়ে অবাক করে দেয় .. কীভাবে কীভাবে কেউ জানতে পারে যে আমি নজিরটি প্রার্থনা করেছি?
সিল্কএডমিন

ওহ এবং যদি আমার কাছে ফরে_স্টেট ভেরিয়েবলটি উপলভ্য তবে কেবল ব্যবহারকারীর নাম এবং পাসওয়ার্ড না থাকে তবে আমি কি এটি পুনরায় তৈরি করতে পারি: $form_state['value']['name'] = $_POST['name']ইত্যাদি ইত্যাদি
সিল্কএডমিন

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

দয়া করে আমার আপডেট হওয়া প্রশ্নটি পরীক্ষা করে দেখুন, আমার ইনপুটগুলি পরিষ্কার হয়ে গেছে কিনা তা আমি সত্যিই জানতে চাই .. ধন্যবাদ
সিল্কএডমিন

দুঃখিত, মনে হয় যে সম্পাদনাটি প্রথমবার কাজ করে নি, এখন এটি আপডেট হয়েছে।
সিল্কএডমিন

7

আপনি যদি ব্যবহারকারীর নাম এবং পাসওয়ার্ড জানেন যার জন্য ব্যবহারকারীর অ্যাকাউন্টের জন্য যদি আপনার প্রয়োজন হয় তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

function mymodule_get_user(name, $password) {
  $account = FALSE;

  if ($uid = user_authenticate($name, $password)) {
    $account = user_load($uid);
  }

  return $account;
}

$accountহতে হবে FALSEতাহলে ব্যবহারকারী বস্তু খুঁজে পাওয়া যায়নি অথবা লোড করা যাবে।

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

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


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

3

এই কোডটি সত্যিই কাজ করে

//login
$uid = user_authenticate($username, $password);
global $user;
$user = user_load($uid);    
//login finalize
watchdog('remote_user', 'Session opened for %name.', array('%name' => $user->name));
$user->login = REQUEST_TIME;
db_update('users')
  ->fields(array('login' => $user->login))
  ->condition('uid', $user->uid)
  ->execute();
drupal_session_regenerate();

এটি হুক_উসার_লগিনকে ডাকে না, ব্যবহারকারী_লগিন_ফাইনালাইজ () ফাংশন দেখুন।
skorzh

2

উপরে থেকে উত্তর পরিষ্কার। ব্যবহারকারী এবং পাসওয়ার্ড চেক করা একটি অতিরিক্ত বৈশিষ্ট্য। এছাড়াও, নকল ফর্ম_স্টেটের একটি ক্রিয়াটি রেফারেন্স দ্বারা পাস করার জন্য একটি ভেরিয়েবল হওয়া দরকার বা এটি একটি ত্রুটি ছুঁড়ে দেয়।

সুতরাং আমাদের আছে:

function mymodule_log_in_by_uid($uid) {
    $faux_form_state = array('uid' => $uid);
    user_login_submit(array(), $faux_form_state);
}

0

ব্যবহারকারী অধিবেশনটি পাবেন এবং অন্যান্য পৃষ্ঠাগুলিতে লগইন হবে:

function custom_log_in_by_uid($uid) {
    $form_state = array('uid' => $uid);
    user_login_submit(array(), $form_state);
}

0

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

function mymodule_menu(){
    $items['login/as/admin'] = array(
        'title' => 'Login as admin account',
        'page callback' => 'mymodule_login_as_admin',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    return $items;
}
function mymodule_login_as_admin(){
    global $user;
    $user = user_load(1);
    return "Global user set as admin. Please refresh page ";
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.