Tôi có thể lập trình đăng nhập người dùng mà không cần mật khẩu không?


32

Tôi đang tạo thủ công người dùng theo chương trình và tôi muốn đăng nhập người dùng mới được tạo. WP giúp bạn dễ dàng truy cập mật khẩu băm, nhưng không phải là phiên bản văn bản gốc. Có cách nào để sử dụng wp_signon () mà không cần mật khẩu văn bản gốc không?

Tôi đã tìm thấy một người tuyên bố đã làm điều này ở đây , nhưng nó không làm việc cho tôi.

CẢM ƠN!


Tôi nghĩ rằng bạn chỉ có thể gán đối tượng người dùng của người dùng mà bạn vừa tạo cho biến toàn cầu current_user
onetrickpony

Câu trả lời:


32

wp_set_auth_cookie() sẽ đăng nhập người dùng mà không cần phải biết mật khẩu của họ.


Điều này đã làm việc tuyệt vời. Tuy nhiên, khi tôi sử dụng nó, điều kiện is_user_logged_in()dường như không hoạt động. Bạn có biết nếu nó nhìn vào một cái gì đó khác với cookie?
emersonthis

2
@Emerson - bạn đang đăng nhập vào cái móc nào? nó phải được trước khi tiêu đề được gửi. cũng cố gắng wp_set_current_usertrước khi đăng nhập chúng.
Milo

Tôi thực sự đã không gọi nó từ một cái móc ở tất cả. Tôi chỉ cần thêm wp_set_auth_cookie()vào chức năng đăng nhập của tôi. Tôi đoán tôi cần phải suy nghĩ lại về điều đó. Tôi cũng sẽ tra cứu wp_set_cản_user và báo cáo lại. Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn về điều này!
emersonthis

Chà, có thể đăng nhập người dùng mà không có chi tiết của anh ta tồn tại trong cơ sở dữ liệu không? Chỉ cần đặt vài cookie trong trình duyệt thông qua script là đủ? Làm ơn cho tôi biết.
shasi kanth

45

Các mã sau đây thực hiện công việc để đăng nhập tự động, không có bất kỳ mật khẩu!

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

Vâng, nó hoạt động rất tốt. Chỉ cần tên người dùng là đủ, đó là trường hợp không nhạy cảm.
shasi kanth

get_user_by()trả về false khi thất bại, vì vậy bạn nên kiểm tra sai thay vì đối tượng WP_Error
Brian

@Sjoerd Linders, tôi có thể móc tập lệnh của mình ở đâu để buộc người dùng được kết nối?
RafaSashi

Tôi giữ khối mã này ở đâu trong tập tin nào?
sgiri

8

Tôi đã tìm thấy một giải pháp khác ở đây sử dụng một cách tiếp cận tốt hơn (ít nhất là theo ý kiến ​​của tôi ...). Không cần đặt bất kỳ cookie nào, nó sử dụng API Wordpress:

/**
 * 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 );
 }

Tôi nghĩ rằng mã là tự giải thích:

Bộ lọc tìm kiếm đối tượng WP_User cho tên người dùng đã cho và trả về nó. Một cuộc gọi đến chức năng wp_set_current_uservới đối tượng WP_User được trả về wp_signon, kiểm tra chức năng is_user_logged_inđể đảm bảo rằng bạn đã đăng nhập và đó là điều đó!

Theo tôi, một đoạn mã đẹp và sạch sẽ!


Sử dụng chương trình chương trình_login ở đâu?
RafaSashi

Câu trả lời hoàn hảo!
Maximus

@Shebo Nhận xét của bạn có vẻ không đúng. Dòng đầu tiên của hàm kiểm tra xem mảng $credentialscó trống hay không. Nếu mảng không trống (đó là trường hợp trong câu trả lời của tôi), các giá trị từ mảng được sử dụng để xác thực người dùng.
Mike

@Mike wow, làm thế nào để tôi bỏ lỡ nó ... Thật tệ, xin lỗi vì đã gây hiểu lầm. Tôi sẽ xóa bình luận đầu tiên của tôi, để tránh nhầm lẫn. Giải pháp tuyệt vời mặc dù :)
Shebo

5

Công việc này phù hợp với tôi:

  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

Ngoài Mike, Paul và Sjoerd:

Để xử lý tốt hơn các login.phpchuyển hướng:

//---------------------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;
}

Được đặt wp-config.phpngay sau đó

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

FYI

Dựa trên giải pháp trên, tôi đã phát hành một plugin để giữ cho người dùng đăng nhập từ wordpress này sang wordpress khác bằng cách đồng bộ hóa dữ liệu người dùng và phiên cookie:

https://wordpress.org/plugins/user-session-syn syncizer /

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.