アルファサード株式会社 代表取締役 野田 純生のブログ


PHPerのためのMovable Type講座(その15)


公開日 : 2014-05-23 13:08:33


PHPでログイン状態のチェックを行う

昨日、ログインの実装についてのコードを紹介しました。最後に宿題? 出しましたけど...

せっかくなのでたまには課題

では、これでログイン処理ができたとして、以降のリクエストのログインチェック、ユーザー情報の取得とコンテクストへのセットはどのようにすればよいでしょうか?

と、いうことで回答編(と、おまけ付き)。

PHPerのためのMovable Type講座

クッキーからのログイン状態のチェックについて

  • クッキーからセッションをチェック
  • セッションの有効期限チェック
  • セッションからユーザーを割り出し、存在するか、もしくは有効なユーザーかチェック
  • 必要に応じて権限のチェック

というような流れになります。

<?php
include('/path/to/mt/php/mt.php');
$mt = MT::get_instance(1, '/path/to/mt/mt-config.cgi');
if ( $session_id = $_COOKIE[ 'mt_commenter' ] ) {
    // セッションをチェック
    require_once( 'class.mt_session.php' );
    $session = new Session;
    $session->Load( "session_id='${session_id}'&session_kind='SI'" );
    if ( isset( $session ) ) {
        $ttl = $mt->config( 'UserSessionCookieTimeout' );
        if ( ( $session->session_start + $ttl ) < time() ) {
            // 有効期限切れ
            $session->Delete();
            echo 'Your session has expired. Please sign in again to comment.';
            return;
        } else {
            $author = $mt->db()->fetch_author_by_name( $session->session_name );
            // ユーザーチェック
            if ( isset( $author ) ) {
                if ( $author->author_status != 1 ) {
                    unset( $author );
                }
            }
        }
    }
}
if (! isset( $author ) ) {
    echo 'Permission denied.';
    return;
}
// 必要に応じて権限(mt_permissionやmt_association)のチェック

コンテキストにユーザーをセットする

こうすることで、MTAuthorFoo タグ、ユーザーカスタムフィールドの値が取得できるようになります。

// $ctx = $mt->context();
// $ctx->stash( 'author', $author );

おまけ - パスワードのポリシーチェックの実装

昨日、ユーザーのパスワードの生成方法についてご紹介しました。

コードのコメントにも書いていますが、MTのパスワードは、sha512で暗号化されており、「$6$暗号化文字列$暗号化されたパスワード」という形式になっています。 ということで、ユーザーのパスワードを生成するロジックは以下。

ただ、実際にプログラムで一括でユーザー登録なんかを行ったりサインアップ画面を用意した時にこのコードではパスワードのポリシーチェックが入りません。

MTのパスワードポリシーでは、以下の指定ができます。

パスワードの検証条件を、以下の三つの値で指定します。組み合わせて指定する場合は、複数回、指定してください。

  • letternumber 文字と数字の両方を含める。
  • upperlower 大文字と小文字の両方を含める。
  • symbol 記号を含める。

※管理画面からも設定できるのですが、実はこいつはダイナミックパブリッシングからはうまく取得できないようです(FogBugzに投げ済み)。

また、文字数については以下の環境変数または管理画面から設定できます。デフォルトでは8文字以上。

なので、そのルーチンも書いてみました。

function verify_password_strength ( $mt, $username, $pass ) {
    $constrains = $mt->config( 'UserPasswordValidation' );
    $min_length = $mt->config( 'UserPasswordMinLength' );
    if ( strpos( strtolower( $pass ), strtolower( $username ) ) !== FALSE ) {
        return 'Password should not include your Username';
    }
    require_once( 'MTUtil.php' );
    if ( length_text( $pass ) < $min_length ) {
        return "Password should be longer than ${min_length} characters";
    }
    if ( is_array( $constrains ) ) {
        if ( in_array( 'letternumber', $constrains ) ) {
            if ( ( preg_match( "/[a-zA-Z]/", $pass ) ) &&
                ( preg_match( "/\d/", $pass ) ) ) {
            } else {
                return 'Password should include letters and numbers';
            }
        }
        if ( in_array( 'upperlower', $constrains ) ) {
            if ( ( preg_match( "/[a-z]/", $pass ) ) &&
                ( preg_match( "/[A-Z]/", $pass ) ) ) {
            } else {
                return 'Password should include lowercase and uppercase letters';
            }
        }
        if ( in_array( 'symbol', $constrains ) ) {
            if (! preg_match( "/[!\"#$%&\'\(\|\)\*\+,-\.\/\\:;<=>\?@\[\]^_`{}~]/", $pass ) ) {
                return 'Password should contain symbols such as #!$%';
            }
        }
    }
    return '';
}


このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の代表取締役社長であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ