web-dev-qa-db-fra.com

Restreindre la connexion de l'utilisateur par adresse IP

J'ai un site Web qui nécessite une connexion pour que les utilisateurs puissent le consulter. J'ai configuré un utilisateur unique pour que tous les membres internes puissent consulter le site Web. Toutefois, je souhaite limiter cet utilisateur à notre adresse IP spécifique.

Je peux voir que vous pouvez limiter l'accès à l'ensemble du site à une adresse IP via htaccess, mais je n'ai besoin de l'implémenter que pour un utilisateur, afin qu'il ne puisse voir le site Web que depuis notre adresse IP.

Est-ce possible?

1
Futwill

Validation de l'adresse IP lors de l'authentification - pour un utilisateur sélectionné uniquement

Voici un moyen d’attacher le filtre authenticate et de valider l’adresse IP d’un utilisateur donné lors de l’authentification.

L'utilisateur peut voir l'erreur d'adresse IP non valide comme indiqué ci-dessous:

invalid IP address

/**
 * Validate IP Address During Authentication - For A Given User 
 */
add_filter( 'authenticate', function( $user )
{
    // Adjust to your needs:
    $allowed_user_ip        = '127.0.0.1';
    $ip_restricted_user_id  = 1;

    // Current user's IP address
    $current_user_ip = isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : null;

    // Nothing to do for valid IP address
    if( $current_user_ip === $allowed_user_ip )
        return $user;

    // Nothing to do for users that are not IP restricted 
    if( 
           $user instanceof \WP_User 
        && $user->ID > 0
        && $ip_restricted_user_id != $user->ID
    )   
        return $user;

    // Add an 'Invalid IP address' error
    if( is_wp_error( $user ) )
        $user->add( 
            'invalid_ip', 
            sprintf(
            '<strong>%s</strong>: %s',
            esc_html__( 'ERROR', 'mydomain' ),
            esc_html__( 'IP address is invalid.', 'mydomain' )
        )
    ); 
    // Create a new 'Invalid IP address' error
    else
        $user = new WP_Error(
            'invalid_ip', 
            sprintf(
                '<strong>%s</strong>: %s',
                esc_html__( 'ERROR', 'mydomain' ),
                esc_html__( 'IP address is invalid.', 'mydomain' )
            )
        ); 

    return $user;
}, 100 );

Ici, nous utilisons la priorité 100 à cause de ces rappels par défaut:

add_filter( 'authenticate', 'wp_authenticate_username_password',  20, 3 );
add_filter( 'authenticate', 'wp_authenticate_email_password',     20, 3 );
add_filter( 'authenticate', 'wp_authenticate_spam_check',         99    );

Il devrait être possible de l'étendre pour gérer un groupe d'utilisateurs ou un rôle d'utilisateur donné.

2
birgire