Nasuta<http://www.nasuta.jp/>

2006年06月20日

定期的なテーブルのクリーンアップ


ユーザ登録で仮登録、本登録のステップを踏むケースでは仮登録で放置されるとデータベースにゴミが残りますので、これを定期的に削除します。


クリーンアップメソッドをモデルに追加

Userモデルに24時間以上経っていて、status がfalseのレコードを削除するメソッドを追加します。

def self.cleanup
User.delete_all(["status = ? and update_at < ?",false,1.days.ago]);
end

ここで status = false と直接記載するとsqlite3ではエラーになります。sqlite3ではfalseは'f'として保存しているので status = 'f' と書けばエラーにならないのですが、これではほかのDBとの互換性がとれません。このようにプレースホルダをつかうと違いを吸収してくれるようです。続きを読む
posted by ふんじ at 00:27| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

2006年05月03日

勘違い、railsのセッション管理

Railsのセッションクッキーの有効期限ってブラウザの立ち上がっている間だけだったんですね。 もっと永続的な有効期限を使っていると思っていました。

cookie

続きを読む
posted by ふんじ at 21:14| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

2006年04月22日

セッション固定攻撃対策

コントローラのテストの前にセッション固定攻撃(Session Fixation Attack)の対策をやってみます。 以下のサイトを参考にしました。

Journal InTime - CSRF対策 , Login GeneratorのSession Fixation Attack対策 , クッキーのパス , セッションファイルの作成場所

決定てきな対策は無いみたいなのですが、二つの方法がメジャーなようです。

  1. セッションにIPアドレスを保存しておき、IPアドレスに変化があったらセッションが不正とみなす。ただし、 この方法は攻撃者ではない正しいユーザの場合でもISPからの割り当てアドレスが変更になると無効となってしまいます。
  2. ログインする前にセッションがある場合はログイン成功後にログイン前のセッションを廃棄し、新たにセッションを生成する。 こうすればログインに成功したセッションだけが有効となります。

今回は2のみ実装します。1は一長一短ありますが、 ユーザが動作を選択できるようにするなどすれば利便性もそれほど損なわれずに実装可能なのではないかと考えています。IPの保存は宿題。

続きを読む
posted by ふんじ at 18:36| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

2006年04月21日

ユーザコントローラの設計(1) - ログイン

ユーザ管理用のコントローラをつくります。 まず、ログイン、ログオフに必要なアクションを実装してみます。
  • login_form / ログインフォームを表示
  • login / メアドとパスワードによる認証
  • logout / ログアウト
あぷりにユーザ管理用コントローラ"User"を追加します。
colinux:~/ror/test# script/generate controller User login_form login logout
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/user
      exists  test/functional/
      create  app/controllers/user_controller.rb
      create  test/functional/user_controller_test.rb
      create  app/helpers/user_helper.rb
      create  app/views/user/login_form.rhtml
      create  app/views/user/login.rhtml
      create  app/views/user/logout.rhtml

colinux:~/ror/test/app/controllers# cat user_controller.rb
class UserController < ApplicationController

  def login_form
  end

  def login
  end

  def logout
  end
end
続きを読む
posted by ふんじ at 21:09| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

2006年04月18日

ユーザモデルのテスト-(2) ログインメソッドの実装

ユーザモデルにログインメソッドを追加しました。コントローラに実装するほうがベターな気もしましたが、ハッシュ化のロジックをモデルに隠蔽したほうがすっきりしそうなので、まずはモデルに追加する方向でやってみます。

require 'digest/sha1'
class User < ActiveRecord::Base
  attr_accessor :password,:email
  attr_accessible :name,:password,:email

  def before_create
    self.hashed_email = User.getHash(self.email)
    self.hashed_passwd = User.getHash(self.password)
  end

  def after_create
    @email = nil
    @password = nil
  end

  private
  def self.getHash(val)
    Digest::SHA1.hexdigest(val)
  end

  public
  def self.login(email,passwd)
    hashed_email = getHash(email)
    hashed_passwd = getHash(passwd)
    find_by_hashed_email_and_hashed_passwd_and_status(hashed_email,hashed_passwd,true)
  end
end
続きを読む
posted by ふんじ at 21:25| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

2006年04月16日

ユーザモデルのテスト開始

Userクラスのユニットテストにトライしてみます。まず Userの追加をテストします。
user_test.rbにtest_create というメソッドを追加。fixtureには以前に定義したように2レコード記載されています。よって、このテストが成功すればあらかじめ読み込まれた2レコードも含め合計3レコード作成されることになります。
続きを読む
posted by ふんじ at 15:48| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

ActiveRecord::Migration でbooleanを追加

ユーザアカウントの登録で仮登録中ステータスを関するためにusersテーブルにステータスを追加します。
colinux:~/ror/test# script/generate migration add_status
      exists  db/migrate
      create  db/migrate/004_add_status.rb
続きを読む
posted by ふんじ at 14:32| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

2006年04月15日

スキーマの変更

fixtureのデータがDBに入っているのは分かったのですが、lastlogin_atの値に日付情報が無いことが分かりました。これは列を time で定義してしまったからで、datetimeで設定する必要がありました。 migration を使って timeからdatetimeに変更してみます。
mysql> select * from users \G;
*************************** 1. row ***************************
           id: 1
 hashed_email: hogehoge@email.com
hashed_passwd: __passwd__
   created_at: NULL
    update_at: NULL
 lastlogin_at: 00:00:00
         name: __nickname__
*************************** 2. row ***************************
           id: 2
 hashed_email: user2@email.addr.co.jp
hashed_passwd: __passwd__2
   created_at: NULL
    update_at: NULL
 lastlogin_at: 11:11:11
         name: __nickname__2
続きを読む
posted by ふんじ at 19:42| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

fixtureを使った初期データのセット

テストをする前にfixture がちゃんと動作するか確認してみました。結果としてこれだけでバグが見つかったのでやって良かった。

fixtureとはテストするためにあらかじめ用意するテストデータをセットする設定ファイルで YAMLフォーマットです。続きを読む
posted by ふんじ at 19:27| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

2006年04月12日

ActiveRecord::Migration のテスト

データベースをSQLではなく、ActiveRecord::Migration をつかうことによってDBに依存せず、RubyのソースコードのみでDBスキーマを管理することができます。

まずはテスト用のデータベース"test_development"を作成してmigration の動作を確認してみます。続きを読む
posted by ふんじ at 20:44| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

2006年04月08日

ユーザ管理設計開始

Railsの紹介サイトなんかではショッピングカートなど動くアプリを作ったのにちユーザ管理を後から追加する手順での説明が多いみたいですが、 それだと思わぬバグで他人のデータにアクセスできてしまったりするので、まず最初にユーザ管理を設計することにします。

本当はユーザ登録なしで使えればベストなんですけどね。メモ帳アプリなら内容をパスワードで暗号化できるようにしておき、 URLとパスワードをメールで送るような仕組みにすればいいのかな?これもおもしろそうだが、 ひとまずおいておいてblogのユーザ管理の設計するべ。

続きを読む
posted by ふんじ at 18:25| Comment(0) | TrackBack(0) | ユーザ管理 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。