it-swarm.asia

كيف أقوم بتسجيل الدخول برمجيًا إلى مستخدم؟

أنا أبحث عن واجهة برمجة التطبيقات التي ستسمح لي بتسجيل الدخول لمستخدم بتمرير اسم المستخدم وكلمة المرور. هل يملك احد خبرة في هذا؟

للتوضيح ، أحاول إنشاء مربع تسجيل دخول AJAX يظهر كنافذة منبثقة على الصفحة الرئيسية ، ولا تقم بتحديث الصفحة في حالة وجود بيانات اعتماد خاطئة ، ولكن فقط إذا كان تسجيل الدخول هو صحيح ، إليكم ما قمت به حتى الآن:

تحديث

أقوم الآن بتحميل نموذج تسجيل الدخول على صفحتي الرئيسية ، ثم عند التقديم أقوم بتشغيل طلب AJAX الذي يرسل بيانات الاعتماد إلى هذا البرنامج النصي:

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;
}; 

تعمل حتى الآن ، لكن مخاوفي هي (كما ذكر googletorp) قضايا أمنية ؛ يبدو أنه لم يقم أي من API التي استخدمتها في هذا البرنامج النصي بتعقيم البيانات على أي حال.

هل سيرى أحد طريقة أفضل للقيام بذلك؟

41
silkAdmin

قد يساعد هذا شخصًا ما:

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;
    }
}
33
user1750

لا توجد وظيفة API بسيطة لذلك.

يمكنك أن تفعل ما Drupal يفعل:

  1. اختبار كلمة المرور عن طريق الاستعلام عن قاعدة البيانات انظر:

ser_login_name_validate ()
ser_login_authenticate_validate ()
ser_login_final_validate ()

  1. استبدل global $user.

    global $user;
    $user = user_load($uid);
    
  2. تعامل مع الجلسات

user_login_finalize($form_state);

بالنسبة للخطوتين الثانية والثالثة ، انظر user_login_submit()

تستند جميع هذه الوظائف على استدعائها من نموذج. التدفق الطبيعي هو أن معالجات التحقق تختبر إدخال المستخدمين وترجع معرف المستخدم في حالة نجاح التحقق. ثم يعالج معالج الإرسال تسجيل الدخول الفعلي للمستخدم والاتصال بخطاف المستخدم.

19
googletorp

إذا كنت بحاجة إلى الحصول على كائن المستخدم لحساب المستخدم الذي تعرف اسم المستخدم وكلمة المرور ، فيمكنك استخدام الرمز التالي:

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

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

  return $account;
}

$account سيكون FALSE إذا تعذر العثور على كائن المستخدم أو تحميله.

يجب عليك استخدام هذا الرمز عندما تحصل الوحدة الخاصة بك ، على سبيل المثال ، على اسم المستخدم وكلمة المرور كمدخلات من المستخدم ، وتتحقق مما إذا كانت صحيحة ، ثم تفعل شيئًا مع كائن المستخدم.
إذا كنت تكتب وحدة نمطية تحتاج إلى انتحال صفة مستخدم لكتابة تعليق ، أو القيام بشيء آخر يحتاج إلى تحقيقه كما فعله المستخدم ، وهو ما تتبع مشكلة المشروع الوحدة النمطية عند إغلاق تقرير مشكلة كان في حالة تم إصلاحه لمدة أسبوعين (في هذه الحالة ، يضيف التعليق "مغلق تلقائيًا - إصدار تم إصلاحه لمدة أسبوعين بدون أي نشاط "والذي تم كتابته بواسطة مستخدم" رسالة النظام ") ، فأنت لست بحاجة إلى اسم المستخدم وكلمة المرور. ما عليك سوى تحميل كائن المستخدم الذي تعرف معرف المستخدم الخاص به.

على حد علمي ، لا توجد أي مشاكل أمنية في الرمز الذي أبلغت عنه.
قد ترغب في تحديد عدد عمليات تسجيل الدخول الفاشلة ؛ أو لمنع عنوان IP الذي يحاول تسجيل الدخول دون نجاح ، أو يحاول تسجيلات دخول مختلفة في وقت قصير.

7
kiamlaluno

يعمل هذا الرمز حقًا

//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();
3
vacho

تنظيف الجواب من أعلاه. التحقق من المستخدم وكلمة المرور ميزة إضافية. أيضًا ، يجب أن تكون form_state المزيفة متغيرًا ليتم تمريره بالرجوع إلى الوظيفة أو أنها تؤدي إلى حدوث خطأ.

ومن ثم لدينا:

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

سيتلقى المستخدم الجلسة وسيتم أيضًا تسجيل الدخول إلى صفحات أخرى:

function custom_log_in_by_uid($uid) {
    $form_state = array('uid' => $uid);
    user_login_submit(array(), $form_state);
}
1
Віктор Плясун

في بعض الأحيان نحتاج إلى تسجيل دخول سريع من URL أو نسيت كلمة مرور المسؤول. ما عليك سوى تنفيذ وظيفتين أدناه لتسجيل الدخول كمستخدم 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 ";
}
0
Girish Bathyal