restful_authenticationによるユーザ認証を実装

6月 29th, 2008

restful_authenticationというプラグインを利用してRaisアプリにユーザ認証を実装する。
先のopenidによるものとはまた全く別で。
(何度も失敗したのに、いつのまにか成功していた。なぜじゃ?)
Railsは2.0.2、Mac OSX環境で実行。

データベースの作成
$ mysql5 -u root でMySQLに繋いで

mysql> create database blog_development;
mysql> grant all on blog_development.* to 'root'@'localhost' identified by '';
※ユーザ名はroot、passwordはなしで。こうしておけばDBとの接続設定のymlファイルをそのままでいいから。

Railsアプリを作成(blogという名前でMySQLを使用)

$ rails -d mysql blog

作成したblogディレクトリに移動してscaffoldを実行。この際に必要なテーブル定義(フィールドの設定)もしておく。モデル名はEntry。

$ ruby script/generate scaffold Entry title:string content:text

ユーザ認証の機能をつけるために、プラグインの
restful_authentication
をインストールする。

プラグインのインストールに使うコマンドは
$ ruby script/plugin install プラグインURL

プラグインはRailsアプリケーションごとにインストールするので、作成中の(このプラグインを利用したい)Railsアプリケーションのフォルダ(この場合はblogという名前の)に移動してから以下のコマンドを実行してインストール。

$ ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication/

インストールしたプラグインは作成中の(このプラグインを利用したい)Railsアプリの中のvendorフォルダにインストールされる。
つづいて、ユーザ認証に必要なモデルとコントローラを追加する。このプラグインのインストールによって加わったジェネレータコマンド「authenticated」を利用し、引数に「user sessions」を指定する。

$ ruby script/generate authenticated user sessions

つづいて、生成されたUsersモデルを扱うために必要なUsersテーブルを作成する。テーブル定義はすでに前述のジェネレータコマンドで済んでいるので $ rake db:migrate でマイグレーションを実行。

$ rake db:migrate

ここから先はAuthenticationSystemの組み込み。

app/controllers/sessions_controller.rb
を開いて、四行目の
include AuthenticatedSystem
をカットして保存。

同じフォルダ内にある
application.rb
を開いて
class ApplicationController < ActionController::Base
の内側にカットしたソースをペースト。

これでユーザ認証の機能が実装された。Railsではアクションごとにユーザ認証をかけるために「フィルタ」という仕組みを利用する。ユーザ認証はアクションを実行する前にフィルタを通す必要があるので「Before」フィルタを使う。

ユーザ認証をかけたい部分の***_controller.rb(この場合はapp/controllers/entries_controller.rb)というファイルを開き、二行目にそのフィルタを追記する。

before_filter :login_required, :except => [:index, :show]
※:exceptはオプションで、ここで指定されているindex(一覧ページ)は認証なしで閲覧可能になっている。

WEBrickを起動させてlocalhost:3000/entriesにアクセス。新しく記事を追加するためにNew entryをクリックするとlogin認証画面が出現する。まだログインするためのユーザ登録をしていないので、URLをlocalhost:3000/users/newにしてアクセスし直す。ここで必要なフォームの内容を埋めてユーザ登録をすれば、ここで設定したログイン情報でNew entryする権限を得ることが出来る。

※ユーザ登録画面(users/new)画面にアクセスしようとするとエラーが出て、なかなかうまくいかなかったのに、いつのまにかうまくいくようになった。なぜだろう。この作業のちょっと前にやったopenidライブラリのインストール($ sudo gem install ruby-openid)は関係ないよなぁ。

※ルートエラーが出ていたから、config/routes.rbの中になんか問題とか足りないものがあったのかと思ってたんだけど。

ユーザアカウントの作成を制限する

管理用のアカウントを作成したら、アカウント作成に制限をかける。(このままの状態だと誰でもアカウントを作成できてしまうので)

app/controllers/users_controller.rb
の中の記述を以下のように修正する。

class UsersController < ApplicationController
  # Be sure to include AuthenticationSystem in Application Controller instead
  include AuthenticatedSystem

  ↓

class UsersController < ApplicationController
  before_filter :login_required

ルーティングの修正

config/routes.rb
を開いて、ログアウトやログインやサインアップ時に、より分かりやすいパスで実行できるように以下の内容を追記する。

※authenticatedジェネレータコマンドを実行した際に表示されていたログ内にも記述されていた。

map.signup '/signup', :controller => 'users', :action => 'new'
map.login '/login', :controller => 'sessions', :action => 'new'
map.logout '/logout', :controller => 'sessions', :action => 'destroy'
タグ:

Entry Filed under: Memo

Leave a Comment

Required

Required, hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackback this post  |  Subscribe to the comments via RSS Feed


Recent Entries

カテゴリー

Tags

flickrRSS

080905nukadukeThe Birthday's New CD080904nukadukerice bran pickles

Links

Archives