ユーザ認証を行う
次に、ログイン用のフォームなどを使用して、Webアプリケーションのユーザ認証を助けてくれるプラグインである、Catalyst::Plugin::Authenticationを紹介します。
こちらについても、セッション管理と同様に「認証手段」と「ユーザ管理」の方法をさまざまなプラグインから選択できるようになっています。
それぞれ、Catalyst::Authentication::CredentialとCatalyst::Authentication::Storeネームスペース以下にさまざまな手法によるプラグインが容易されています。
ネームスペースから「Plugin」がなくなっていますが、これはCatalyst::Plugin::Authenticationの0.10以降からこちらのネームスペース以下に実装されるようになっていますのでご注意ください。
また、ユーザ認証については、Catalyst::Plugin::Authentication::InternalsやCatalyst Tutorial - Chapter 5: Authenticationに仕組みの解説、チュートリアルなどがまとまっていますので、詳細を知りたい方はぜひとも読んでみてください。
さまざまな認証手段
認証手段を提供するプラグインは、Catalyst::Authentication::Credentialネームスペース以下も定義されています。その中でも主要なプラグインには次のようなものがあります。
Plugin名(Catalyst::Authenticationを省略) | 説明 |
Credential::Password | パスワードによる認証 |
Credential::HTTP | HTTPのベーシック認証/ダイジェスト認証 |
Credential::Kerberos | Kerberosサーバによる認証 |
Credential::OpenID | OpenIDによる認証 |
Credential::OAuth | OAuthによる認証 |
ここで紹介したもの以外でも、FlickrやFacebookのユーザ認証を使用できるプラグインが公開されています。
さまざまなユーザ管理
ユーザ管理を行うためのプラグインは、Catalyst::Authentication::Storeネームスペース以下に定義されています。その中でも主要なプラグインには次のようなものがあります。
Plugin名(Catalyst::Authenticationを省略) | 説明 |
Store::Htpasswd | .htpasswdファイルによる管理 |
Store::DBI | DBIを使用したデータベースによる管理 |
Store::DBIx::Class | DBIx::Classを使用したデータベースによる管理 |
Store::LDAP | LDAPサーバによる管理 |
さらに詳細を見ていくと、Storeプラグインには、ユーザ情報を保存するためのストレージとの仲立ちをするためのバックエンドモジュールと、ユーザ情報を管理するためのユーザオブジェクトクラスの2つが用意されています。
このユーザオブジェクトは、Catalyst::Authentication::Userから継承しています。
その他のプラグイン
Webサイトによっては、ユーザによって閲覧できるページを制限したい場合などが出てきます。もちろんユーザ単位で制限をかけることもできますが、ユーザ数が増えてくるといちいち閲覧可能なユーザを管理する手間が増えてきて、運用に支障が出てき始めます。
一般的にはユーザをグループ化し、そのグループごとに権限を付与することでアクセス権限(Role)の管理を簡単にします。
Catalystでは、Catalyst::Plugin::Authorization::Rolesを使用することで、このような機能を実現することができます。
ユーザ認証機能をインストール/設定する
今回のサンプルでは、ユーザ管理にCatalyst::Authentication::Store::Htpasswdを、認証手段としてはCatalyst::Authentication::Credential::Passwordを使うことにします。
それぞれのプラグインをインストールしましょう。
# perl -MCPAN -e 'install Catalyst::Authentication::Store::Htpasswd'
# perl -MCPAN -e 'install Catalyst::Authentication::Credential::Password'
次にこれらのプラグインを設定しますが、セッション管理の場合と異なり、プラグインの登録部分ではAuthenticationだけを記述し、CredentialとStoreに関する設定は、configで行います。
設定箇所は次のようになります。
# 省略 use Catalyst qw/ -Debug ConfigLoader Static::Simple Session Session::State::Cookie Session::Store::File Authentication /; # 省略 __PACKAGE__->config( # 省略 # ユーザ認証関連のパラメータ登録 'Plugin::Authentication' => { use_session => 1, default_realm => 'default', default => { # (1)Credentialの設定 credential => { class => 'Password', password_field => 'password', password_type => 'self_check', }, # (2)Storeの設定 store => { class => 'Htpasswd', file => 'sample_htpasswd', }, }, }, );
(1)では、Catalyst::Authentication::Credential::Passwordを使うための設定をしています。classに設定する値を切り替えることで、他のCredentialモジュールを使用できるようになります。
password_fieldには、ユーザオブジェクトでパスワードを含むフィールド名を指定します。一般的には「password」が使用されますが、ユーザ情報を管理するモジュールによっては異なる場合もあります。
password_typeには、パスワードの種類を指定します、パスワードが平文で入っている場合、暗号化されている場合、ハッシュ化されている場合などさまざまなケースに対応できるようになっています。ここではStoreモジュールとしてHtpasswdを使用しているため、Credentialモジュール側ではなく、Storeモジュールが返すユーザオブジェクトのcheck_password()メソッドを呼び出すことを意味する値(self_check)を指定しています。
(2)では、Catalyst::Authentication::Store::Htpasswdを使うための設定をしています。ここでもclassには使用するStoreモジュールを指定します。
Htpasswdモジュールではユーザ情報の管理方法としてhtpasswdファイルを使用することから、「file」の値として、実際に用意するhtpasswdファイルを指定します。
次に、ユーザ管理で使用するhtpasswd形式のファイルを作ります。ファイル名は上記で指定した「sample_htpasswd」として、最初のアカウントを登録しましょう。このサンプルではパスワードとして「1234」を使用しました。
$ htpasswd -c ~/AppSample/sample_htpasswd hanada