मैं उपयोगकर्ता में प्रोग्रामेटिक रूप से कैसे लॉग इन कर सकता हूं?


41

मैं एपीआई की तलाश कर रहा हूं जो मुझे उपयोगकर्ता नाम और पासवर्ड पारित करके लॉगिन करने देगा। क्या किसी के पास इसका अनुभव है?

स्पष्ट करने के लिए, मैं एक 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;
}; 

अब तक यह काम करता है, लेकिन मेरी चिंताएं (जैसा कि गोगोलेटो द्वारा वर्णित है) सुरक्षा मुद्दे हैं; ऐसा लगता है कि इस स्क्रिप्ट में उपयोग किए गए किसी भी एपीआई ने किसी भी तरह से डेटा को साफ नहीं किया।

किसी को भी ऐसा करने के लिए एक बेहतर तरीका देखेंगे?


किस कारण से आपको उपयोगकर्ता नाम और पासवर्ड का उपयोग करके कोड से लॉग इन करना होगा?
kiamlaluno

@ kiamlaluno क्योंकि मुझे लॉगिन फॉर्म पर अजाक्स का उपयोग करने की आवश्यकता है। मेरे पूर्ववर्ती प्रश्नों में: 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 पहले से ही $ uid लौटाता है ताकि उपयोगकर्ता ऑब्जेक्ट को लोड करने की कोई आवश्यकता न हो;)
FLY

7
दूसरा कोड ब्लॉक काम नहीं करेगा; user_login_submit का दूसरा arg रेफरी द्वारा पारित किया गया है; इसे सरणी का आउटपुट पास करने से () विफल हो जाएगा।
शॉन कॉन

किसी पंजीकरण फॉर्म का उपयोग करने के बाद किसी उपयोगकर्ता को ऑटो-लॉगिन करने के लिए इस उत्तर का उपयोग कैसे किया जाएगा? मैं ऐसा करना चाहूंगा, लेकिन पासवर्ड एक हैश है जब खाता ऑब्जेक्ट के माध्यम से पैरामीटर के रूप में प्रदान किया जाता है, hook_user_insertलेकिन जवाब में उपरोक्त फ़ंक्शन पासवर्ड को मूल सादे पाठ के रूप में चाहते हैं। मुझे लगता है कि मुझे hook_form_alterइसके बजाय प्रयास करने की आवश्यकता होगी ...
therobyouknow

नए उपयोगकर्ता के बनने के बाद सीधे स्वचालित लॉगिन की तलाश करने वाले लोगों के लिए (उदाहरण के लिए उपयोगकर्ता साइन-अप पंजीकरण फ़ॉर्म जैसे 'उपयोगकर्ता / रजिस्टर'), इस समाधान को देखें: drupal.stackexchange.com/a/254905/1082
theryyouknow

19

उसके लिए एक साधारण एपीआई फ़ंक्शन नहीं है।

आप वही कर सकते हैं जो द्रुपाल करता है:

  1. डेटाबेस को देख कर पासवर्ड का परीक्षण करें:

user_login_name_validate ()
user_login_authenticate_validate ()
user_login_final_validate ()

  1. ओवरराइट करें global $user

    global $user;
    $user = user_load($uid);
    
  2. सत्र को संभालें

user_login_finalize($form_state);

चरण दो और 3 के लिए देखें user_login_submit()

ये सभी कार्य एक फॉर्म से बुलाए जाने पर आधारित हैं। सामान्य प्रवाह यह है कि मान्य हैंडलर उपयोगकर्ताओं के इनपुट का परीक्षण करते हैं और सत्यापन पास होने पर उपयोगकर्ता के यूआईडी को लौटा देते हैं। सबमिट हैंडलर तब उपयोगकर्ता के वास्तविक लॉगिन और कॉलिंग उपयोगकर्ता हुक को संभालता है।


धन्यवाद googletorp, मैं कोशिश करता हूँ कि बाहर, हालांकि यह मुझे आश्चर्य है कि कैसे यह कार्य एक साथ काम करता है .. कैसे एक जानता है कि मैंने मिसाल का आविष्कार किया था?
रेशम एडमीन

ओह, और अगर मेरे पास From_state चर availlable नहीं है, लेकिन केवल उपयोगकर्ता नाम और पासवर्ड है, तो क्या मैं इसे फिर से बना सकता हूं: $form_state['value']['name'] = $_POST['name']और इसी तरह ..
SilkAdmin

@silk आपको हमेशा Drupal FAPI का उपयोग करना चाहिए जो आपको $form_stateचर देता है । बहुत सारी अच्छी सुरक्षा जाँचें होती हैं जिन्हें आप अन्यथा ढीले कर सकते हैं और हमलों के लिए अपनी साइट खोल सकते हैं। जब उपयोगकर्ता में प्रवेश करने की बात आती है, तो आप उस सुरक्षा को ढीला नहीं करना चाहते।
googletorp

कृपया मेरे अपडेट किए गए प्रश्न की जांच करें, मैं वास्तव में यह जानना चाहूंगा कि क्या मेरे इनपुट साफ हो गए हैं .. धन्यवाद
SilkAdmin

क्षमा करें, ऐसा लगता है कि संपादन ने पहली बार काम नहीं किया, अब यह अपडेट हो गया है।
रेशम एडमीन

7

यदि आपको उस उपयोगकर्ता खाते के लिए उपयोगकर्ता ऑब्जेक्ट प्राप्त करने की आवश्यकता है जिसके लिए आप उपयोगकर्ता नाम और पासवर्ड जानते हैं, तो आप निम्न कोड का उपयोग कर सकते हैं:

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

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

  return $account;
}

$accountहो जाएगा FALSEअगर उपयोगकर्ता वस्तु नहीं मिली या लोड किया जा सकता।

आपको इस कोड का उपयोग करना चाहिए जब, उदाहरण के लिए, आपके मॉड्यूल को उपयोगकर्ता से इनपुट के रूप में उपयोगकर्ता नाम और पासवर्ड मिलता है, यह सत्यापित करता है कि क्या वे सही हैं, और फिर यह उपयोगकर्ता ऑब्जेक्ट के साथ कुछ करता है।
यदि आप एक मॉड्यूल लिख रहे हैं, जिसमें उपयोगकर्ता को टिप्पणी लिखने के लिए, या कुछ और करने की आवश्यकता होती है, जो उपयोगकर्ता द्वारा किए जाने की आवश्यकता होती है, जो कि प्रोजेक्ट समस्या ट्रैकिंग मॉड्यूल एक समस्या रिपोर्ट को बंद करते समय करता है। दो सप्ताह के लिए निश्चित स्थिति (उस स्थिति में, यह टिप्पणी "स्वचालित रूप से बंद - कोई गतिविधि के साथ 2 सप्ताह के लिए तय किया गया मुद्दा" जो "सिस्टम संदेश" उपयोगकर्ता द्वारा लिखा गया है) जोड़ता है, तो आपको उपयोगकर्ता नाम और पासवर्ड की आवश्यकता नहीं है। आप केवल उस उपयोगकर्ता ऑब्जेक्ट को लोड करते हैं जिसके लिए आप उपयोगकर्ता आईडी को जानते हैं।

जहां तक ​​मुझे पता है, मेरे द्वारा बताए गए कोड के साथ कोई सुरक्षा समस्या नहीं है।
आप असफल लॉगिन की संख्या को सीमित करना चाहते हैं; या आईपी को अस्थायी ब्लॉक करने के लिए जो सफलता के बिना लॉग इन करने की कोशिश करता है, या कम समय में विभिन्न लॉगिन की कोशिश करता है।


धन्यवाद kiamlaluno, यह मैंने क्या किया है, लेकिन मैं अब सुरक्षा के मुद्दों के बारे में चिंता कर रहा हूँ, कृपया मेरे अद्यतन प्रश्न की जांच करें
रेशमअन

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();

यह hook_user_login को आमंत्रित नहीं करता है, user_login_finalize () फ़ंक्शन देखें।
skorzh

2

ऊपर से जवाब साफ। उपयोगकर्ता और पासवर्ड की जाँच एक अतिरिक्त सुविधा है। इसके अलावा, नकली form_state को फ़ंक्शन के संदर्भ में पारित होने के लिए एक चर होने की आवश्यकता है या यह एक त्रुटि फेंकता है।

इसलिए हमारे पास है:

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

कभी-कभी हमें URL से त्वरित लॉगिन या पासवर्ड भूल जाना चाहिए। Drupal में उपयोगकर्ता 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 ";
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.