Authorization in Catalyst

一边看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的开发速度够快。所以,以后就不要使用三个表的设计了。

Pretty print macro expansion

*scratch* buffer里面运行macroexpand展开宏后的程序全在一行,不好读,使用pp可以获得更好的效果。

(defun wl-pp-macroexpand-at-point ()
  (interactive)
  (pp-eval-expression '(macroexpand (read (thing-at-point 'sexp)))))

(define-key emacs-lisp-mode-map (kbd "C-c C-c") 'wl-pp-macroexpand-at-point)

将光标放在想要展开的宏调用的左括号前,调用该程序,宏展开的结果显示在*Pp Eval Output* buffer里。

如果想看宏调用执行后的结果,可以使用下面的函数。

(defun wl-pp-evaluate-at-point ()
  (interactive)
  (pp-eval-expression (macroexpand (read (thing-at-point 'sexp)))))

(define-key emacs-lisp-mode-map (kbd "C-c C-e") 'wl-pp-evaluate-at-point)