パスワードなしでプログラムでユーザーにログインできますか?


32

プログラムでユーザーを手動で作成していますが、新しく作成したユーザーにサインインしたいです。WPを使用すると、プレーンテキストバージョンではなく、ハッシュされたパスワードに簡単にアクセスできます。平文パスワードなしでwp_signon()を使用する方法はありますか?

ここでこれを行ったと主張する一人の人を見つけましたが、それは私にとってはうまくいきませんでした。

ありがとう!


作成したユーザーのユーザーオブジェクトをcurrent_userグローバル変数に割り当てることができると思います
-onetrickpony

回答:


32

wp_set_auth_cookie() パスワードを知らなくてもユーザーをログインさせます。


これはうまくいきました。ただし、使用すると、条件is_user_logged_in()が機能しないようです。Cookieとは異なるものを見ているかどうか知っていますか?
emersonthis

2
@Emerson-どのフックにログインしていますか?ヘッダーが送信される前でなければなりません。wp_set_current_userログインする前に試してください
ミロ

私は実際にはフックからそれを呼び出していませんでした。wp_set_auth_cookie()サインイン機能に追加しました。私はそれを再考する必要があると思います。また、wp_set_current_userを検索して報告します。これにご協力いただきありがとうございます!
-emersonthis

さて、ユーザーの詳細をデータベースに存在させずにユーザーをログインさせることは可能ですか?スクリプトを介してブラウザに設定するクッキーが少ないだけで十分ですか?私にお知らせください。
シャシカント14

45

次のコードは、パスワードなしで自動ログインを実行します!

// Automatic login //
$username = "Admin";
$user = get_user_by('login', $username );

// Redirect URL //
if ( !is_wp_error( $user ) )
{
    wp_clear_auth_cookie();
    wp_set_current_user ( $user->ID );
    wp_set_auth_cookie  ( $user->ID );

    $redirect_to = user_admin_url();
    wp_safe_redirect( $redirect_to );
    exit();
}

まあ、それは素晴らしい作品です。ユーザー名だけで十分です。大文字と小文字は区別されません。
シャシカント14

get_user_by()失敗するとfalseを返すため、WP_Errorオブジェクトの代わりにfalseをチェックする必要があります
ブライアン

@Sjoerd Linders、ユーザーを強制的に接続するためにスクリプトをどこにフックできますか?
ラファサシ

このコードブロックをどのファイルのどこに保存しますか?
sgiri

8

ここで、より良いアプローチを使用する別のソリューションを見つけました(少なくとも私の意見では...)。Cookieを設定する必要はありません。WordpressAPIを使用します。

/**
 * Programmatically logs a user in
 * 
 * @param string $username
 * @return bool True if the login was successful; false if it wasn't
 */
    function programmatic_login( $username ) {
        if ( is_user_logged_in() ) {
            wp_logout();
        }

    add_filter( 'authenticate', 'allow_programmatic_login', 10, 3 );    // hook in earlier than other callbacks to short-circuit them
    $user = wp_signon( array( 'user_login' => $username ) );
    remove_filter( 'authenticate', 'allow_programmatic_login', 10, 3 );

    if ( is_a( $user, 'WP_User' ) ) {
        wp_set_current_user( $user->ID, $user->user_login );

        if ( is_user_logged_in() ) {
            return true;
        }
    }

    return false;
 }

 /**
  * An 'authenticate' filter callback that authenticates the user using only     the username.
  *
  * To avoid potential security vulnerabilities, this should only be used in     the context of a programmatic login,
  * and unhooked immediately after it fires.
  * 
  * @param WP_User $user
  * @param string $username
  * @param string $password
  * @return bool|WP_User a WP_User object if the username matched an existing user, or false if it didn't
  */
 function allow_programmatic_login( $user, $username, $password ) {
    return get_user_by( 'login', $username );
 }

コードは自明だと思います:

フィルターは、指定されたユーザー名のWP_Userオブジェクトを検索して返します。wp_set_current_userによって返されたWP_Userオブジェクトを使用した関数の呼び出し、関数をwp_signon使用したis_user_logged_inログインの確認、およびそれだけです!

私の意見では、きれいできれいなコードです!


programmatic_loginを使用する場所
RafaSashi

完璧な答え!
マキシマス

@Sheboコメントは正しくないようです。関数の最初の行は、配列$credentialsが空かどうかをチェックします。配列が空でない場合(これは私の答えです)、配列の値はユーザーの認証に使用されます。
マイク

@マイクすごい、どうやって見逃したのか…。混乱を避けるために、最初のコメントを削除します。しかし素晴らしいソリューション:)
Shebo

5

これは私にとってうまくいきます:

  clean_user_cache($user->ID);
  wp_clear_auth_cookie();
  wp_set_current_user($user->ID);
  wp_set_auth_cookie($user->ID, true, false);
  update_user_caches($user);

2

マイク、ポール、シェードに加えて:

login.phpリダイレクトを適切に処理するには:

//---------------------Automatic login--------------------

if(!is_user_logged_in()){

    $username = "user1";

    if($user=get_user_by('login',$username)){

        clean_user_cache($user->ID);

        wp_clear_auth_cookie();
        wp_set_current_user( $user->ID );
        wp_set_auth_cookie( $user->ID , true, false);

        update_user_caches($user);

        if(is_user_logged_in()){

            $redirect_to = user_admin_url();
            wp_safe_redirect( $redirect_to );
            exit;
        }
    }
}
elseif('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] == wp_login_url()){

    $redirect_to = user_admin_url();
    wp_safe_redirect( $redirect_to );
    exit;
}

wp-config.php直後に配置する

require_once(ABSPATH . 'wp-settings.php');

参考までに

上記のソリューションに基づいて、ユーザーデータとCookieセッションを同期することにより、ユーザーが1つのワードプレスから別のワードプレスにログインし続けるためのプラグインをリリースしました。

https://wordpress.org/plugins/user-session-synchronizer/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.