Catalyst 的用户鉴定登陆
Category: Catalyst Keywords: Authentication Catalyst
因为最近开始有点闲下来(当然,虽说闲下来也有很多事情要做,比如毕业论文,实习,part-time job 等),于是在刚过去的一个多小时里开始了一直想写的基于 Catalyst 的论坛程序。坦白说,Catalyst 我也有很多地方都不懂,都没试验过。因为要写论坛程序,类似 Session, Authentication 这样的东西是必不可少,于是就试了下 Catalyst 的 Authentication 插件。写个详细的流程,方便诸位再次试验。
- 首先当然是创建整个项目的结构:(过程部分略)
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
.. - 创建数据库 foorum, 创建表 user, 表的结构其他不管,两个字段是必须的,username 和 password
- 修改文件:
- Foorum.pm
package Foorum;
因为在 Win32 下跑,所以 Catalyst::Plugin::Session::Store::FastMmap 是安装不起来的,而我试了下 Catalyst::Plugin::Session::Store::DBI 发现报错,最后只好转为 Catalyst::Plugin::Session::Store::File .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 );
}
用 File 模块,于是在与 lib script 同级目录下创建了个文件夹 sessions - foorum.yml
---
大致看看并会明白。密码用 SHA-1 加密。
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 - 修改 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;
- Foorum.pm
- 上面大致就是所有的准备工作了。接下来就是对 Foorum::Controller::User 做一些动作了。
因为是测试,所以我们先增加了一条纪录。
package Foorum::Controller::User;
而 Authentication 的验证过程就开始变得简单了。因为仅仅是试验,所以就用了最简单的代码。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.');
}
sub login : Local {
大致并是如是,运行后先访问 http://fayland:3000/user/insert 来插入数据,然后运行 http://fayland:3000/user/login 来做测试。如果是 123456 屏幕就会输出 hello, fayland,不是的话就会输出 failed.
my ( $self, $c ) = @_;
if ( $c->login('fayland', '123456') ) {
$c->res->body("hello, " . $c->user->username);
} else {
$c->res->body('failed');
}
}
上面并是所有的大致过程。详细的查阅 Catalyst::Plugin::Authentication 或者等我继续。我还要继续写 Foorum 代码,或许过几天就会再次讲到详细的应用。have fun!