web-dev-qa-db-ja.com

Wordpress認証ミドルウェア

私が達成したいのは、

すべてのリクエストについて、ユーザーがログインしていない場合、ユーザーはログインページにリダイレクトされます。ユーザーがログインしている場合、そのユーザーはそのサイトにアクセスできます。

class Auth{

    protected static $instance = null;

    public function checkAuth(){
        auth_redirect();
    }

    public static function getInstance() {

        if (null == self::$instance) {
            self::$instance = new self;
        }

        return self::$instance;
    }

}

このドラフトクラスを持つことは、このチェックのための最良のアクションフックです。 wpname__、initname__、template_redirect

使用例

add_action('wp', array(Auth::getInstance(), 'checkAuth'));

UPDATE

私はフックで少し遊んでみました、そして私はそれに気づきました:

それを 'wp'または 'template_redirect'にフックすると、ログインページが表示されますが、ログインするたびに何度も何度もログインするように要求されます。

Initにフックすると

リクエストURIが長すぎる

要求されたURLの長さがこのサーバーの容量制限を超えています。

問題はauth_redirect()ワードプレス関数にあるようです。

Authクラス内のcheckAuth関数を次のように変更します。

if(!is_user_logged_in()) wp_safe_redirect(site_url('/wp-login.php'));

3つのフックをもう一度テストしたところ、wpとtemplate_redirectは正常に動作しますが、initフックはリダイレクトループエラーを引き起こします。

なぜこれが起こっているのですか? (Refrence: `auth_redirect`を使う:ログインしていてもログインを求め続けます

1
Laxmana

これは私が書いたマルチサイトプラグインの一部で、ユーザーにログインを強制しています。そのためにはユーザーをサイトに登録する必要がありました。ネットワークユーザーだけではありません。ユーザーがより高い役割を持っているかどうかを確認するように変更することができます。 OPの要件に合わせて修正しました。

add_action( 'init', 'registration_check',5);

function registration_check() {
    if ( is_user_logged_in() ) { return; }
    // if ( current_user_can('read') ) { return; }  // orig for multisite

    // This is a base array of pages that will be EXCLUDED from being blocked
    $exclusions = array(
            'wp-login.php',
            'wp-register.php',
            'wp-cron.php', // Just incase
            'wp-trackback.php',
            'wp-app.php',
            'xmlrpc.php',
            );
    // If the current script name is in the exclusion list, abort
    if ( in_array( basename($_SERVER['PHP_SELF']), $exclusions ) ) {
        return;
    }

    // if ( is_user_logged_in() ) { wp_die('<strong>You are logged in but do not have enough privileges to access this site.</strong>'); } // orig for multisite
    // Still here? Okay, then redirect to the login form
    auth_redirect();
}
3
user42826