PHPerのためのMovable Type講座(その15)
公開日 : 2014-05-23 13:08:33
PHPでログイン状態のチェックを行う
昨日、ログインの実装についてのコードを紹介しました。最後に宿題? 出しましたけど...
せっかくなのでたまには課題
では、これでログイン処理ができたとして、以降のリクエストのログインチェック、ユーザー情報の取得とコンテクストへのセットはどのようにすればよいでしょうか?
と、いうことで回答編(と、おまけ付き)。
- PHPerのための Movable Type 講座(その1)
- PHPerのための Movable Type 講座(その2)
- PHPerのための Movable Type 講座(その3)
- PHPerのための Movable Type 講座(その4)
- PHPerのための Movable Type 講座(その5)
- PHPerのための Movable Type 講座(その6)
- PHPerのための Movable Type 講座(その7)
- PHPerのための Movable Type 講座(その8)
- PHPerのための Movable Type 講座(その9)
- PHPerのための Movable Type 講座(その10)
- PHPerのための Movable Type 講座(その11)
- PHPerのための Movable Type 講座(その12)
- PHPerのための Movable Type 講座(その13)
- PHPerのためのMovable Type講座(その14)
クッキーからのログイン状態のチェックについて
- クッキーからセッションをチェック
- セッションの有効期限チェック
- セッションからユーザーを割り出し、存在するか、もしくは有効なユーザーかチェック
- 必要に応じて権限のチェック
というような流れになります。
<?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 '';
}