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

| コメント(0) | トラックバック(0)

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 '';
}

トラックバック(0)

トラックバックURL: http://junnama.alfasado.net/cgi/mt/mt-tb.cgi/838

コメントする

Facebook

Twitter

このブログ記事について

このページは、Junnama Nodaが2014年5月23日 13:08に書いたブログ記事です。

ひとつ前のブログ記事は「Basic認証設定を管理画面から行える Movable Type プラグインを作った。」です。

次のブログ記事は「JavaScript製のWebベースエディタ「Ace」が良さげ。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6