23 February 2006
This post may be outdated due to it was written on 2006. The links may be broken. The code may be not working anymore. Leave comments if needed.
因为最近开始有点闲下来(当然,虽说闲下来也有很多事情要做,比如毕业论文,实习,part-time job 等),于是在刚过去的一个多小时里开始了一直想写的基于 Catalyst 的论坛程序。坦白说,Catalyst 我也有很多地方都不懂,都没试验过。因为要写论坛程序,类似 Session, Authentication 这样的东西是必不可少,于是就试了下 Catalyst 的 Authentication 插件。

写个详细的流程,方便诸位再次试验。

  1. 首先当然是创建整个项目的结构:(过程部分略)
    catalsyt Foorum
    cd Foorum
    perl script/foorum_create.pl controller User
    perl script/foorum_create.pl view TT TT
    perl script/foorum_create.pl model DBIC DBIC
    ..
  2. 创建数据库 foorum, 创建表 user, 表的结构其他不管,两个字段是必须的,username 和 password
  3. 修改文件:
    • Foorum.pm
      package Foorum;

      use strict;
      use warnings;

      use Catalyst qw/
         -Debug
         ConfigLoader
         Authentication
         Authentication::Store::DBIC
         Authentication::Credential::Password
         Session
         Session::Store::File
         Session::State::Cookie
         Static::Simple/;

      our $VERSION = '0.01';

      __PACKAGE__->setup;

      sub default : Private {
      my ( $self, $c ) = @_;

      # Hello World
      $c->response->body( $c->welcome_message );
      }

      因为在 Win32 下跑,所以 Catalyst::Plugin::Session::Store::FastMmap 是安装不起来的,而我试了下 Catalyst::Plugin::Session::Store::DBI 发现报错,最后只好转为 Catalyst::Plugin::Session::Store::File .
      用 File 模块,于是在与 lib script 同级目录下创建了个文件夹 sessions
    • foorum.yml
      ---
      name: Foorum
      dsn: dbi:mysql:foorum
      dsn_user: root
      dsn_pwd: ''

      authentication:
      dbic:
      user_class: "Foorum::Model::DBIC::User"
      user_field: "username"
      password_field: "password"
      password_type: "hashed"
      password_hash_type: "SHA-1"
      session:
      expires: 3600
      storage: __HOME__/sessions

      大致看看并会明白。密码用 SHA-1 加密。
    • 修改 Model/DBIC.pm
      package Foorum::Model::DBIC;

      use strict;
      use base 'Catalyst::Model::DBIC';

      __PACKAGE__->config(
      dsn => Foorum->config->{dsn},
      password => Foorum->config->{dsn_pwd},
      user => Foorum->config->{dsn_user},
      options => { AutoCommit => 1, RaiseError => 1, PrintError => 1 },
      relationships => 1,
      );

      1;

    • 创建 Model/DBIC/User.pm
      package Foorum::Model::DBIC::User;

      use strict;
      use base 'Foorum::Model::DBIC';

      1;

  4. 上面大致就是所有的准备工作了。接下来就是对 Foorum::Controller::User 做一些动作了。
    因为是测试,所以我们先增加了一条纪录。
    package Foorum::Controller::User;

    use strict;
    use warnings;
    use base 'Catalyst::Controller';

    sub insert : Local {
       my ( $self, $c ) = @_;
       
       use Digest ();
       my $password = '123456';

       my $d = Digest->new( 'SHA-1' );
       $d->add($password);
       my $computed = $d->digest;
       
       $c->model('DBIC')->table('user')->create({
       username => 'fayland',
       password => $computed
       });
       
       $c->res->body('hi, add test user name to table.');
    }

    而 Authentication 的验证过程就开始变得简单了。因为仅仅是试验,所以就用了最简单的代码。
    sub login : Local {
       my ( $self, $c ) = @_;
       
       if ( $c->login('fayland', '123456') ) {
           $c->res->body("hello, " . $c->user->username);
       } else {
           $c->res->body('failed');
       }
    }
    大致并是如是,运行后先访问 http://fayland:3000/user/insert 来插入数据,然后运行 http://fayland:3000/user/login 来做测试。如果是 123456 屏幕就会输出 hello, fayland,不是的话就会输出 failed.

上面并是所有的大致过程。详细的查阅 Catalyst::Plugin::Authentication 或者等我继续。我还要继续写 Foorum 代码,或许过几天就会再次讲到详细的应用。have fun!



blog comments powered by Disqus