web-dev-qa-db-ja.com

プログラムでユーザーをログインさせるにはどうすればよいですか?

ユーザー名とパスワードを渡してユーザーをログインさせるAPIを探しています。誰もがこれで経験がありますか?

明確にするために、ホームページにポップアップとして表示される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);

ステップ2と3については user_login_submit() を参照してください

これらの関数はすべて、フォームから呼び出されることに基づいています。通常のフローでは、検証ハンドラーがユーザー入力をテストし、検証に合格するとユーザーのuidを返します。次に、送信ハンドラがユーザーの実際のログインと呼び出し元のユーザーフックを処理します。

19
googletorp

ユーザー名とパスワードがわかっているユーザーアカウントのユーザーオブジェクトを取得する必要がある場合は、次のコードを使用できます。

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

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

  return $account;
}

$accountは、ユーザーオブジェクトが見つからないかロードできない場合はFALSEになります。

このコードは、たとえば、モジュールがユーザーからのユーザー名とパスワードを入力として取得し、それらが正しいかどうかを確認してから、ユーザーオブジェクトで何かを行うときに使用します。
コメントを書くためにユーザーを偽装する必要があるモジュールを書いている場合、またはユーザーが行った結果を必要とする他のことをしている場合 プロジェクトの問題追跡 モジュールは、2週間fixedステータスになっている問題レポートを閉じるときに実行します(その場合、コメント「自動クローズ-問題「システムメッセージ」ユーザーによって書き込まれた2週間の「アクティビティなし」の結果が修正された場合)、ユーザー名とパスワードは必要ありません。ユーザーIDがわかっているユーザーオブジェクトをロードするだけです。

私の知る限り、報告したコードにはセキュリティ上の問題はありません。
失敗したログインの数を制限することができます。または、成功せずにログインしようとしたり、短時間で別のログインを試みたりする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);
}

URLからの迅速なログインや管理者パスワードの忘れが必要になる場合があります。 Drupalでユーザー1としてログインするには、以下の2つの関数を実装するだけです。

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