パスワードなしでプログラムでユーザーにログインできますか?
-
-
作成したばかりのユーザーのユーザーオブジェクトをcurrent_userグローバル変数に割り当てることができると思いますI think you can just assign the user object of the user you just created to the current_user global variable
- 0
- 2012-05-28
- onetrickpony
-
6 回答
- 投票
-
- 2012-05-28
wp_set_auth_cookie()
は、パスワードを知らなくてもユーザーをログインさせます.wp_set_auth_cookie()
will log a user in without having to know their password.-
これはうまくいきました.ただし、使用すると、条件付きの `is_user_logged_in()`が機能しないようです.クッキーとは違うものを見ているかどうか知っていますか?This worked great. However, when I use it, the conditional `is_user_logged_in()` doesn't seem to work. Do you know if it's looking at something different than the cookies?
- 0
- 2012-05-28
- emersonthis
-
@ Emerson-どのフックにログインしていますか?ヘッダーが送信される前でなければなりません.また、ログインする前に[`wp_set_current_user`](http://codex.wordpress.org/Function_Reference/wp_set_current_user)を試してください.@Emerson - what hook are you logging them in on? it has to be before headers are sent. also try to [`wp_set_current_user`](http://codex.wordpress.org/Function_Reference/wp_set_current_user) before logging them in.
- 2
- 2012-05-28
- Milo
-
私は実際にはフックからそれをまったく呼んでいませんでした.サインイン関数に `wp_set_auth_cookie()`を追加しました.私はそれを再考する必要があると思います.また、wp_set_current_userを検索して、レポートを返します.これについてご協力いただきありがとうございます!I actually wasn't calling it from a hook at all. I just added `wp_set_auth_cookie()` into my signin function. I guess I need to rethink that. I'll also lookup wp_set_current_user and report back. Thank you very much for your help on this!
- 0
- 2012-05-28
- emersonthis
-
さて、データベースに詳細が存在しなくてもユーザーにログインすることは可能ですか?スクリプトを介してブラウザにいくつかのCookieを設定するだけで十分ですか?私にお知らせください.Well, is it possible to login a user without having his details exist in database? Just setting few cookies in browser through script is enough? Please let me know.
- 0
- 2014-02-06
- shasi kanth
-
- 2014-01-03
次のコードは、パスワードなしで自動ログインの役割を果たします!
// 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(); }
The following code does the job for automatic login, without any password!
// 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(); }
-
まあ、それはうまくいきます.ユーザー名だけで十分ですが、大文字と小文字は区別されません.Well, it works great. Just the username is enough, which is case insensitive.
- 0
- 2014-02-06
- shasi kanth
-
`get_user_by()`は失敗するとfalseを返すため、WP_Errorオブジェクトの代わりにfalseをチェックする必要があります`get_user_by()` returns false on failure, so you should check for false instead of the WP_Error object
- 1
- 2016-04-14
- somebodysomewhere
-
@Sjoerd Linders、ユーザーを強制的に接続させるために、スクリプトをどこにフックできますか?@Sjoerd Linders, where can I hook your script in order to force a user to be connected?
- 0
- 2016-08-31
- RafaSashi
-
このコードブロックをどのファイルのどこに保存しますか?Where do I keep this block of code in which file?
- 0
- 2019-05-28
- sgiri
-
- 2014-07-31
より良いアプローチを使用する別の解決策
ここを見つけました(少なくとも私の意見では...). 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
によるチェックで、ログインしていることを確認します.それだけです!私の意見では、すてきでクリーンなコードです!
I have found another solution here that uses a better approach (at least in my opinion...). No need to set any cookie, it uses the Wordpress API:
/** * 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 ); }
I think the code is self explanatory:
The filter searches for the WP_User object for the given username and returns it. A call to the function
wp_set_current_user
with the WP_User object returned bywp_signon
, a check with the functionis_user_logged_in
to make sure your are logged in, and that's it!A nice and clean piece of code in my opinion!
-
programmatic_loginをどこで使用しますか?where to use programmatic_login?
- 0
- 2016-08-31
- RafaSashi
-
完璧な答え!Perfect answer!
- 0
- 2017-07-08
- Maximus
-
@Sheboあなたのコメントは正しくないようです.関数の最初の行は、配列 `$ credentials`が空かどうかをチェックします.配列が空でない場合(私の答えの場合)、配列の値を使用してユーザーを認証します.@Shebo Your comment doesn't seem to be correct. The first line of the function checks whether the array `$credentials` is empty or not. If the array is not empty (which is the case in my answer), the values from the array are used to authenticate the user.
- 0
- 2017-09-04
- Mike
-
@マイクすごい、どうやってそれを逃したのか...私の悪い、誤解を招くことをお詫びします.混乱を避けるために、最初のコメントを削除します.しかし素晴らしい解決策:)@Mike wow, how do I missed it... My bad, sorry for misleading. I'll delete my first comment, to avoid confusion. Great solution though :)
- 0
- 2017-09-04
- Shebo
-
tryブロックで `wp_signon()`を囲み、finallyブロックで `remove_filter`を呼び出すことは価値があるかもしれません.これにより、フィルターが常に削除されるようになります.It might be worthwhile to enclose `wp_signon()` in a try block and call `remove_filter` in the finally block. This should ensure that the filter is always removed.
- 0
- 2020-07-23
- Leukipp
-
- 2015-06-09
これは私にとってはうまくいきます:
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);
This works well for me:
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);
-
- 2016-08-31
Mike、Paul、Sjoerdに加えて:
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');
FYI
上記のソリューションに基づいて、ユーザーデータとCookieセッションを同期することにより、ユーザーが1つのワードプレスから別のワードプレスにログインし続けるためのプラグインをリリースしました.
In addition to Mike, Paul and Sjoerd:
To better handle
login.php
redirections://---------------------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; }
To be placed in
wp-config.php
just afterrequire_once(ABSPATH . 'wp-settings.php');
FYI
Based on the above solution, I have released a plugin to keep the user logged in from one wordpress to another by synchronizing user data and cookie session:
-
- 2020-05-22
奇妙なことですが、それが機能する唯一の方法は、次の後にリダイレクトしてdie()することです.
clean_user_cache($user->ID); wp_clear_auth_cookie(); wp_set_current_user( $user_id, $user->user_login ); wp_set_auth_cookie( $user_id, true, true ); update_user_caches( $user ); if ( is_user_logged_in() ) { $redirect_to = $_SERVER['REQUEST_URI']; header("location:".$redirect_to ); die(); }
Strange enough but the only way it works for me is if I redirect and die() after:
clean_user_cache($user->ID); wp_clear_auth_cookie(); wp_set_current_user( $user_id, $user->user_login ); wp_set_auth_cookie( $user_id, true, true ); update_user_caches( $user ); if ( is_user_logged_in() ) { $redirect_to = $_SERVER['REQUEST_URI']; header("location:".$redirect_to ); die(); }
プログラムで手動でユーザーを作成していますが、新しく作成したユーザーにサインインしたいと思います.WPを使用すると、ハッシュされたパスワードに簡単にアクセスできますが、プレーンテキストバージョンにはアクセスできません.プレーンテキストのパスワードなしでwp_signon()を使用する方法はありますか?
これをここで行ったと主張する人を1人見つけましたが、実際にはそうではありませんでした私にはうまくいきません.
ありがとう!