目指せ1級!30代サラリーマンボルダリング日記

都内IT企業で働く30代サラリーマンのクライミング記録

2010年07月

20100630211430 よくありそうなこんなかんじのログイン画面。
かんたんログインボタンと、ID/PASS入力するフォーム。

かんたんログインはいろいろありますけど、とりあえず今回は触れません。
キャリアのゲートウェイのIP制限はしましょうってかんじ。


標準のAuthコンポーネントと、ktaiライブラリを使ってます。

UIDが設定してあれば「かんたんログイン」できて、してなければID/PASS入力してUID設定することもできるという機能。
今回はトップページで行う設定です。
Cakeのバージョンは1.3

APP/controllers/top_controller.php

class TopController extends AppController
{
  var $name = 'Top';
  var $uses = 'User';
  var $helpers = array('Ktai','Session','Form');
  var $components = array('Ktai','Session','Auth');

  function beforeFilter() {
    $this->Auth->loginAction = '/';
    $this->Auth->autoRedirect = false;
    $this->Auth->authorize = 'controller';
    $this->Auth->allow('index');
    parent::beforeFilter();
  }

  function beforeRender() {
    parent::beforeRender();
  }

  function index () {
    if ($user = $this->Auth->user()) {
      if (isset($this->data['add_uid'])) {
        $user['User']['uid'] = $this->Ktai->get_uid();
        $this->User->save($user['User']);
/* 7/14追記 */
        $user = $this->User->findById($set['id']);
        $this->Auth->login($user);
/* 7/14追記ここまで */
      }
      $this->redirect($this->Auth->redirect());
    } else {
      if (isset($this->data['auto_login'])) {
        if ($user = $this->User->findByUid($this->Ktai->get_uid())) {
          if ($this->Auth->login($user['User'])) {
            $this->redirect($this->Auth->redirect());
          } else {
            $this->Session->setFlash('再度かんたんログイン設定をしてください',null);
          }
        } else {
          $this->Session->setFlash('かんたんログイン設定がされていません',null);
        }
      }
    }
  }

  function isAuthorized () {
    $user = $this->Auth->user();
    $user['User']['last_login'] = date('Y-m-d H:i:s');
    $this->User->save($user['User']);

    return true;
  }
}

やっていることは以下の3点。
・ID/PASSでログイン成功して、「かんたんログイン設定する」にチェックがされていれば、UIDをとってテーブルに突っ込む。
・かんたんログインの場合はUIDをキーにusersテーブルからデータを取ってきてAuth->loginに突っ込んでログインさせる。
・isAuthorized()でログインが成功したらログイン日時を更新。

usersテーブル

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(10)      | NO   | PRI | NULL    | auto_increment |
| username    | varchar(100) | NO   |     | NULL    |                |
| password    | varchar(100) | NO   |     | NULL    |                |
| uid         | varchar(100) | NO   |     | NULL    |                |
| flag        | int(1)       | NO   |     | NULL    |                |
| last_login  | datetime     | NO   |     | NULL    |                |
| created     | datetime     | NO   |     | NULL    |                |
| updated     | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+


あ、クッキーが使えない携帯がまだまだたくさんあるため(主にdocomo)、そのための設定も忘れないようにメモ。

APP/config/bootstrap.php

if (!isset($_SESSION)) {
  if ($ini_set) {
    ini_set('session.use_trans_sid', 1);
    ini_set('session.serialize_handler', 'php');
    ini_set('session.use_cookies', 0);
  }
}


2010/07/14追記
ログインの際にUIDをテーブルに追加した場合、
$this->Auth->user()で取れるユーザデータはセッションなので再度ログインしないといけないみたい。
    このエントリーをはてなブックマークに追加

テーブルのカラムのタイプをtinyint(1)にして、saveしようとしたんだけど値がおかしい。

  $set = array('type' => 2);
  $this->Data->create();
  $this->Data->save($set);

typeに2を入れようとしてるんだけど、データベース見てみると1になってる!!
ぐぐったらいっぱいでてきたので、みんなやっぱりハマるんだね。。
ちなみにCakePHP1.3です。

Cakephpはtinyintをbooleanにするらしい。。。なんてこった。

CORE/libs/model/datasources/dbo/dbo_mysql.php line474
    if (($col == 'tinyint' && $limit == 1) || $col == 'boolean') {
      return 'boolean';
    }

これは実際体験してみないと気づかないね。。
無駄に時間とられた。
    このエントリーをはてなブックマークに追加

このページのトップヘ