Rejestracja użytkownika, a następnie automatyczne logowanie


15

Korzystam z wtyczki zmodyfikowanej do moich celów.

To, czego szukam, to rejestracja użytkownika w celu automatycznego zalogowania się i powrotu do bieżącej strony. W tej chwili wysyła im wiadomość e-mail z nazwą użytkownika i hasłem. Następnie muszą się zalogować przy użyciu tych danych.


korzystasz z domyślnego lub niestandardowego formularza rejestracyjnego?
Bainternet,

Niestandardowy, ale oparty na przekierowaniach, więc kody zaprojektowane do pracy z domyślnym systemem mogą dobrze działać, a jeśli nie, prawdopodobnie mogę to zmodyfikować.
Robin I Knight

Myślę, że powinienem zauważyć, że automatyczne logowanie użytkownika podczas rejestracji obchodzi część bezpieczeństwa logowania. Zwykle użytkownik nie może się zalogować bez podania prawidłowego adresu e-mail. Użytkownik musi się zarejestrować, otrzymać wiadomość e-mail, a następnie zalogować się. Jeśli usuniesz krok e-mail, użytkownicy mogą zarejestrować się przy użyciu fałszywych adresów, automatycznie się zalogować i mieć dostęp do zaplecza, komentować, bez względu na to, co mogą zrobić domyślni subskrybenci. Kto by skorzystał? Na przykład spamerzy. Hakerzy chętnie szukają dziur w twoim backendie bez konieczności podawania adresu, który mógłby być ujawniający.
s_ha_dum

Odpowiedzi:


10

Zasadniczo do zalogowania użytkownika możesz użyć:

            //Login the user
    $creds = array();
    $creds['user_login'] = $login;
    $creds['user_password'] = $password;
    if ( !empty( $remember ) ){ 
        $creds['remember'] = true;
    }
    $user = wp_signon( $creds, true );

ale dzieje się tak tylko wtedy, gdy masz hasło i login, dzięki czemu możesz utworzyć własny formularz rejestracyjny, przetworzyć go i samodzielnie utworzyć użytkownika

//Only after Everything has been validated, proceed with creating the user
        //Create the user
        $user_pass = wp_generate_password();
        $user = array(
            'user_login' => $username,
            'user_pass' => $user_pass,
            'first_name' => $firstname,
            'last_name' => $lastname,
            'user_email' => $email
        );
        $user_id = wp_insert_user( $user );

        /*Send e-mail to admin and new user - 
        You could create your own e-mail instead of using this function*/
        wp_new_user_notification( $user_id, $user_pass );

a tutaj mamy zarówno login, jak i hasło, dzięki czemu możesz się zalogować.

Mam nadzieję że to pomoże


2
Czy nie ma filtru rejestracyjnego, który można zaczepić?
Zack

1
Podstępne, nie sprawdzę, czy mogę to zintegrować. Nie ma łatwiejszego sposobu. Rozumiem, że wordpress nie ma interesu w zapewnianiu wygodnego get_the_password (), ponieważ wysyła to e-mailem.
Robin I Knight

5

Nie ma idealnego miejsca na przyłączenie się do procesu rejestracji. Myślę, że istnieje mocny argument, aby dodać haczyk akcji rejestracji użytkownika do rdzenia. Ale myślę, że w międzyczasie możesz to sfałszować. Jedną z ostatnich rzeczy, które zdarzają się, gdy użytkownik pomyślnie się zarejestruje, jest utworzenie opcji użytkownika o nazwie „default_password_nag”. Możemy utworzyć akcję, aby na to uważać i ustawić użytkownika, gdy jest ustawiony.

add_action('update_user_metadata', 'my_auto_login', 10, 4);

function my_auto_login( $metaid, $userid, $key, $value ) {
    // We only care about the password nag event. Ignore anything else.
    if ( 'default_password_nag' !== $key  && true !== $value) {
        return;
    }

    // Set the current user variables, and give him a cookie. 
    wp_set_current_user( $userid );
    wp_set_auth_cookie( $userid );
}

Nie przetestowane, ale teoretycznie powinny działać.

Teraz, gdy mamy już pomysł, co robić, opowiem, że uważam to za zły pomysł, jeśli chodzi o bezpieczeństwo. Ludzie mogą tworzyć niepotrzebne konta bez konieczności konfigurowania skrzynki odbiorczej wiadomości-śmieci. :)


1
user_register to całkiem fajne miejsce do przyłączenia się, bo tak myślę?
jsims281,

1

Właśnie udało mi się uruchomić tę funkcjonalność za pomocą haka user_register i następującego kodu w pliku functions.php :

// auto log in a user who has just signed up       
function auto_login_new_user( $user_id ) {
  wp_set_auth_cookie( $user_id, false, is_ssl() );
}
add_action( 'user_register', 'auto_login_new_user' );

Czy nadal powinien to wysłać wiadomość e-mail z potwierdzeniem rejestracji? Nie otrzymuję już tego.
codecowboy

0
function login_after_register($userlogin,$userpass){
    $credentials = array( 'user_login' =>  $userlogin, 'user_password' => $userpass, 'remember' => true );

    $secure_cookie = is_ssl();

    $secure_cookie = apply_filters('secure_signon_cookie', $secure_cookie, $credentials);
    add_filter('authenticate', 'wp_authenticate_cookie', 30, 3);

    $user = wp_authenticate($credentials['user_login'], $credentials['user_password']);
    wp_set_auth_cookie($user->ID, $credentials["remember"], $secure_cookie);
    do_action('wp_login', $user->user_login, $user);
}

1
Podaj wyjaśnienia wraz ze swoim kodem.
s_ha_dum
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.