一边看Jonathan Rockway的书——Catalyst,一边有模有样地学着写,到了authentication and authorization这部分被彻底打败了。
一开始按照书的去做,结果登录部分总是有问题(也可能是自己抄错了),于是去看文档,登录部分问题解决,认证部分又失败。无数次碰壁之后,没法子,只好去看代码,把Catalyst::Plugin::Authentication下面的代码看了个遍,终于搞明白了。有三种方法设计数据库,分别对应一个表、两个表和三个表。使用三个表的时候要使用Catalyst::Plugin::Authentication::Store::DBIC
,其它两种情况要使用Catalyst::Plugin::Authentication::Store::DBIx::Class
。这两个Store的配置方式也是不同的。所谓三个表,就是一个帐号密码表,一个角色(role)表,和一个关联表(记录每个帐号对应的角色);两个表即去掉角色表,而将其内容放在关联表里的角色部分;一个表最简单,将角色直接记录在帐号密码表里面,多个角色用逗号分割,记录在一个字段里。
我按照书上的例子建了三个表,却使用了错误的Store,自然得不到正确的角色信息。而不同的Store,还使用不同的方式验证用户登录,DBIC要用$c->login
,而DBIx::Class要用$c->authenticate
,要命的是传参的方式也不一样,前者接受用户名和密码两个参数,后者却接受Hash,要把用户名和密码对应字段名作为key传进去。这么多对应关系,有一点点错误,就完蛋了。
需要注意的是,文档里提到login函数不再提倡使用,只是为了兼容,才保留在哪里。由此可见,如果不是出书的速度慢了点,就是Catalyst的开发速度够快。所以,以后就不要使用三个表的设计了。