2012年9月29日土曜日

FuelPHPのSimpleAuthのいじり方のメモ

FuelPHP付属のSimpleAuthをちょこっと変更してみたのでメモしておきます。


参考にした記事
SimpleAuthを参考にいじってみました(FuelPHP) : てるてる坊主

この記事で解説されているとおりにして
PKGPATH/auth/classes/auth/login/easyauth.php (simpleauth.phpのコピー)を作成し、それを修正していきました。
以下に試したことを列挙。

ユーザー登録時のメールアドレスの入力を必須ではなく任意にする

データベースのほうでusersテーブルのemailフィールドがnullを許容するように変更してから、create_user()を以下のように変更しました。ついでに例外のメッセージを日本語化。

public function create_user($username, $password, $email, $group = 1, Array $profile_fields = array())
{
    // メールアドレスが入力されたかどうか
    $is_posted_email = false;

    $password = trim($password);

    // メールアドレスが入力されていればフィルタリングする
    if (!empty($email))
    {
        $is_posted_email = true;
        $email = filter_var(trim($email), FILTER_VALIDATE_EMAIL);
    }

    if (empty($username) or empty($password))
    {
        throw new \SimpleUserUpdateException('ユーザーIDまたはパスワードが入力されていません', 1);
    }

    if ($is_posted_email && empty($email))
    {
        throw new \SimpleUserUpdateException('メールアドレスが正しくありません', 1);
    }

    $same_users = \DB::select_array(\Config::get('easyauth.table_columns', array('*')))
        ->where('username', '=', $username);

    if ($is_posted_email)
    {
        $same_users = $same_users->or_where('email', '=', $email);
    }

    $same_users = $same_users
        ->from(\Config::get('easyauth.table_name'))
        ->execute(\Config::get('easyauth.db_connection'));

    if ($same_users->count() > 0)
    {
        if ($is_posted_email && in_array(strtolower($email), array_map('strtolower', $same_users->current())))
        {
            throw new \SimpleUserUpdateException('すでに登録されているメールアドレスです。', 2);
        }
        else
        {
            throw new \SimpleUserUpdateException('すでに使用されているユーザーIDです。', 3);
        }
    }

    $user = array(
        'username'        => (string) $username,
        'password'        => $this->hash_password((string) $password),
        'email'           => $email,
        'group'           => (int) $group,
        'profile_fields'  => serialize($profile_fields),
        'last_login'      => 0,
        'login_hash'      => '',
        'created_at'      => \Date::forge()->get_timestamp()
    );
    $result = \DB::insert(\Config::get('easyauth.table_name'))
        ->set($user)
        ->execute(\Config::get('easyauth.db_connection'));
    return ($result[1] > 0) ? $result[0] : false;
}

get_user_id()をuserのidだけを返すように変更

デフォルトではget_user_id()が返すのは[driverのid, userのid]という配列です。driverのIDを使うことはないと思い、userのidだけを返すように変更しました。

public function get_user_id()
{
    if (empty($this->user))
    {
        return false; 
    }

    return (int) $this->user['id'];
}

こんな感じです。ニックネームや性別の入力を必須にしたりするのも簡単にできそうです。以上、備忘録でした。