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


41

ユーザー名とパスワードを渡すことでユーザーにログインできる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はどれもデータをサニタイズしなかったようです。

誰かがそうするより良い方法を見るでしょうか?


ユーザー名とパスワードを使用して、コードからユーザーをログインする必要があるのはどの理由ですか?
キアムルノ

@ kiamlalunoログインフォームでAjaxを使用する必要があるため。私の先例の質問:drupal.stackexchange.com/questions/5780/…drupal.stackexchange.com/questions/5781 / ...これら2つの問題のいずれも解決できなかったため、カスタムajaxリクエストを求めました。
silkAdmin

回答:


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
2番目のコードブロックは機能しません。user_login_submitの2番目の引数はrefによって渡されます。array()の出力を渡すと失敗します。
ショーンコン

ユーザーが登録フォームを使用して作成された後、この回答を使用してユーザーを自動ログインする方法を教えてください。私はそれをやりたいのですが、アカウントオブジェクトを介してパラメータとして提供される場合、パスワードはハッシュですがhook_user_insert、答えの上記の関数は元のプレーンテキストとしてパスワードを必要とします。hook_form_alter代わりに試してみる必要があると思います
...-therobyouknow

新しいユーザーが作成された直後に自動ログインを探しているユーザー(たとえば、「ユーザー/登録」などのユーザーサインアップ登録フォームを使用)については、このソリューションを参照してください:drupal.stackexchange.com/a/254905/1082
therobyouknow

19

そのための単純なAPI関数はありません。

Drupalの機能を実行できます。

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

ステップ2および3については、 user_login_submit()

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


googletorpに感謝します。これを試してみますが、この機能がどのように連携するのか疑問に思います。
silkAdmin

ああ、From_state変数がなく、ユーザー名とパスワードだけが使用できる場合、次のように再構築でき $form_state['value']['name'] = $_POST['name']ます。など。
silkAdmin11年

@silk $form_state変数を提供するDrupal FAPIを常に使用する必要があります。それ以外の場合はサイトを開放して攻撃にさらす可能性のある優れたセキュリティチェックがたくさんあります。ユーザーのログインに関しては、そのセキュリティを失いたくありません。
googletorp

更新された質問を確認してください。入力がクリーンアップされるかどうか知りたいです。ありがとう
-silkAdmin

申し訳ありませんが、最初は編集が機能しなかったようですが、現在は更新されています。
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週間の固定ステータス(その場合、「システムメッセージ」ユーザーによって書き込まれたコメント「自動クローズ-アクティビティなしで2週間修正された問題」が追加されます)、ユーザー名とパスワードは必要ありません。ユーザーIDがわかっているユーザーオブジェクトを読み込むだけです。

私の知る限り、私が報告したコードにはセキュリティ上の問題はありません。
失敗したログインの数を制限することができます。または、成功せずにログインしようとするIPを一時的にブロックするか、短時間で別のログインを試みます。


kiamlalunoに感謝します、それは私がやったことですが、セキュリティの問題を心配しています。私の更新された質問をチェックしてください
silkAdmin

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としてログインするには、以下の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 ";
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.