ウェブ、ショウジン

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

2009-1-8
Category
プログラミング

restful_authenticationというプラグインを利用してRuby on Railsアプリケーションにユーザ認証を実装する。Railsは2.0.2、Mac OSX環境で実行。

データベースの作成

ユーザ名はroot、passwordはなしで。こうしておけばDBとの接続設定のymlファイルをそのままでいいから。

mysql> create database blog_development;
mysql> grant all on blog_development.* to 'root'@'localhost' identified by '';

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)というファイルを開き、二行目にそのフィルタを追記する。

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

before_filter :login_required, :except => [:index, :show]

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ジェネレータコマンドを実行した際に表示されていたログ内にも記述されていた。

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

Categories

Tag Cloud

AdMob Android Apache centos CodeIgniter EC-CUBE facebookアプリ facebookページ feed Firefox Flash google googleanalytics htaccess iPad iPhone JavaScript lamp mobile nginx ogp pear php plugin rollover rss sendmail setting smarty ssh Titanium Mobile Titanium Studio tutorial ubuntu vim VirtualBox vmware vps Windows WordPress xampp youtube さくらインターネット アクセス解析 カスタム投稿