web-dev-qa-db-fra.com

Rendre le mot de passe invalide une fois déconnecté de la page protégée par mot de passe

Sur un site basé sur WP, j'ai un formulaire personnalisé que je dois cacher au grand public et ne permettre l'accès qu'à une sélection de personnes qui pourraient ensuite obtenir un mot de passe de moi, le saisir, accéder au formulaire et le soumettre. Lors de la soumission du formulaire, je les redirige vers une autre page. J'ai utilisé ce morceau de code ci-dessous dans mon functions.php, qui les déconnecte de la page protégée par mot de passe, une fois redirigé:

add_action( 'wp', 'post_pw_sess_expire' );
    function post_pw_sess_expire() {
    if ( isset( $_COOKIE['wp-postpass_' . COOKIEHASH] ) )
    // Setting a time of 0 in setcookie() forces the cookie to expire with the session
    setcookie('wp-postpass_' . COOKIEHASH, '', 0, COOKIEPATH);
}

Maintenant, la torsion: une fois que quelques-uns de ces choix sont déconnectés de la page protégée par mot de passe, j'ai besoin que le mot de passe devienne invalide. Pas nécessairement, mais un peu comme un mot de passe à usage unique. Une solution serait géniale, ou donnez-moi s'il vous plaît des indications ou des alternatives si ce n'est pas possible.

4
gurung

Après avoir soumis le formulaire et avant de rediriger vers une nouvelle page, réinitialisez le mot de passe de l'utilisateur actuel.

Un simple wp_update_user(array('ID' => $userid, 'user_pass' => 'YourNewPaSSword')); fera tout pour vous.

1
palPalani

J'ai fait ce petit test et ça marche, mais je n'ai aucune idée si c'est techniquement correct :

add_action( 'wp', 'post_pw_sess_expire' );

function post_pw_sess_expire() 
{
    if ( isset( $_COOKIE['wp-postpass_' . COOKIEHASH] ) )
    {
        // Setting a time of 0 in setcookie() forces the cookie to expire with the session
        setcookie('wp-postpass_' . COOKIEHASH, '', 0, COOKIEPATH);
        add_action( 'wp_footer', 'change_pw_wpse_119986' );
    }
}

function change_pw_wpse_119986()
{
    global $post;
    if( $post->post_password == md5('something') )
        return;
    $post->post_password = md5('something');
    wp_update_post( $post );
    remove_action( 'wp_footer', 'change_pw_wpse_119986' );
}

Mais il y a un problème plus important: nous avons un mot de passe par page, pas un mot de passe par personne. Une fois que le premier est entré dans la passe, les suivants ne pourront plus l'utiliser. Vous devrez créer votre propre solution en définissant différents mots de passe et en les désactivant dès que la personne les utilise.

0
brasofilo