Angsuman’s Authenticated WordPress Plugin

WordPress 自体を CUG 化する案件があった。
社内での 一般的な IT 知識の共有のために使いたい ということだ。

この手のリクエストでは、なんらかの Blog システムをインストールして、Basic認証 をかける程度にする場合が多い。企業資産や企業秘密の漏洩に繋がる場合を除いて、ガチガチに認証をかけたいというケースはあまりない。
コストパフォーマンスを考えると、リスクの程度 (確立 x 被害甚大度) によっては、必要充分であるという判断をするケースが多い。

「なんでもかんでも Basic認証というのもエレガントじゃないし、アクセス時の状態を確認してプリパースしてやればいいんじゃね?んなの 数行の PHP ですむでそ?」
「WordPress ならプラグインでそんなのくらいありそーね」
…調べてみた…

Angsuman’s Authenticated WordPress Plugin

WordPress の URI にアクセスしようとすると、現在ログイン中かどうかを判断して、ログイン中でなければ、ログイン画面に移行するということで、全く以ておあつらえ向きな感じ。

ファイルをダウンロードして、例によって、wp-content/plugins に放り込んでやるのみ。
ブツは、ac_authenticator.php という実質10数行のファイルひとつ。

しかも、入れて、Dashboard > Plugins から有効にしてやるだけだと言う。

ところが、ログアウトした後、WordPress にアクセスすると、ログイン画面が出るには出るのだが、
正しい ID / Password を入力してやっても、先に進まない…

対処方法を調べてみると…

[wp-testers] Angsuman’s Authenticated WordPress Plugin
Angsuman’s Authenticated WordPress Plugin just keeps redirecting back
to the dashboard, alternately the Authenticate plugin seems to work
correctly.

ってーのがあったので、スレッドをたどってみる…

Re: [wp-testers] Angsuman’s Authenticated WordPress Plugin
I’m glad you mentioned this. I was planning on bringing this up myself
sometime soon. I also use Angsuman’s plugin. The reason it doesn’t
work in 2.5 is that there’s a new system for generating cookies and
that plugin implicitly relies on the old system.

I work around the issue by modifying the plugin. I replaced this bit:

if ( (!empty($_COOKIE[USER_COOKIE]) &&
!wp_login($_COOKIE[USER_COOKIE], $_COOKIE[PASS_COOKIE], true)) ||
(empty($_COOKIE[USER_COOKIE])) )

with this bit:

global $user_ID;
if (!$user_ID) {

and it _seems_ to work exactly as it should. But it seems too simple.
If it was really that easy, why didn’t it work like that to begin
with? I wonder, is there something I’m missing? Is checking for a
value to $user_ID less secure than verifying cookie contents?

Re: [wp-testers] Angsuman’s Authenticated WordPress Plugin
is_user_logged_in() would be better. That’s been around for many releases.

Ryan

どうやら、ログインしているかどうかを確認するのに使用する cookie のジェネレートシステムが、WordPress2.5以前と以降では異なる ということが原因のよう。

ということで、ac_authenticator.php を修正する。
※ こういうとき、Coda は、直接サーバ内のファイルを修正している感じで便利!

《修正前》

<?php
/*
Plugin Name: Angsuman's Authenticated WordPress Plugin
Plugin URI: http://blog.taragana.com/index.php/archive/angsumans-authenticated-wordpress-plugin-password-protection-for-your-wordpress-blog/
Description: This plugin allows you to make your WordPress site accessible to logged in users only. In other words to view your site they have to create / have an account in your site and be logged in. No configuration necessary. Simply activating the plugin is all that is required from you.
Author: Angsuman Chakraborty, Taragana
Version: 1.0
Author URI: http://blog.taragana.com/
License: Free to use non-commercially.
Warranties: None.
*/
function ac_auth_redirect() {
 // Checks if a user is logged in, if not redirects them to the login page
 if ( (!empty($_COOKIE[USER_COOKIE]) &&
 !wp_login($_COOKIE[USER_COOKIE], $_COOKIE[PASS_COOKIE], true)) ||
 (empty($_COOKIE[USER_COOKIE])) ) {
 nocache_headers();
 header("HTTP/1.1 302 Moved Temporarily");
 header('Location: ' . get_settings('siteurl') . '/wp-login.php?redirect_to=' . urlencode($_SERVER['REQUEST_URI']));
 header("Status: 302 Moved Temporarily");
 exit();
 }
}

if('wp-login.php' != $pagenow && 'wp-register.php' != $pagenow) add_action('template_redirect', 'ac_auth_redirect');
?>

《修正後》

<?php
/*
Plugin Name: Angsuman's Authenticated WordPress Plugin
Plugin URI: http://blog.taragana.com/index.php/archive/angsumans-authenticated-wordpress-plugin-password-protection-for-your-wordpress-blog/
Description: This plugin allows you to make your WordPress site accessible to logged in users only. In other words to view your site they have to create / have an account in your site and be logged in. No configuration necessary. Simply activating the plugin is all that is required from you.
Author: Angsuman Chakraborty, Taragana
Version: 1.0
Author URI: http://blog.taragana.com/
License: Free to use non-commercially.
Warranties: None.
*/
function ac_auth_redirect() {
 // Checks if a user is logged in, if not redirects them to the login page
 if ( !is_user_logged_in() ){
 nocache_headers();
 header("HTTP/1.1 302 Moved Temporarily");
 header('Location: ' . get_settings('siteurl') . '/wp-login.php?redirect_to=' . urlencode($_SERVER['REQUEST_URI']));
 header("Status: 302 Moved Temporarily");
 exit();
 }
}

if('wp-login.php' != $pagenow && 'wp-register.php' != $pagenow) add_action('template_redirect', 'ac_auth_redirect');
?>

思った動きになった。

つか…

auth_redirect()

っていう便利な関数があるわけだから…
Function Reference/auth redirect « WordPress Codex

<?php
if (!is_user_logged_in()) {
        auth_redirect();
}
?>

とかを使用テーマの header.php に書くだけじゃだめ?
…やってみた。できた。www

コメント

  1. bison より:

    当然、WordPress 以下の画像などを直接指定されれば、ログインしていなくてもアクセスできてしまうことには、留意する必要がある。

  2. […] Angsuman’s Authenticated WordPress Plugin | 脳みその中身 […]

  3. […] グると脳みその中身さんのページで紹介されていたので、その通りに実行 […]

  4. […] Angsuman’s Authenticated WordPress Plugin » 脳みその中身 […]

  5. […] ){ に書きかえればOK。 修正箇所はこちらのブログが詳しいですよ。 》Angsuman’s Authenticated WordPress Plugin « 脳みその中身 うまくいきました。 […]

  6. […] 》Angsuman’s Authenticated WordPress Plugin | 脳みその中身 […]

タイトルとURLをコピーしました