通过中间件来实现应用的认证
目前有大量的 Plack 中间件组件,分布在在 Plack 核心发布中包含有,还是 CPAN 上有一些。我写这个 advent calendar 让很多人了解和喜欢这些。
从今天起,我们就为大家介绍其中一些很好的中间件组件,您可以用来快速提升你的 PSGI 的应用程序。
Basic authentication
由于 Plack 中间件包起了一个应用程序,可以很方便的进行 pre-process 或 post-process 来操作 HTTP层的事情。今天我们来谈谈基本身份验证。
加入基本身份验证有几个方法,你可以在你的 web 应用框架那层来支持,象 Catalyst 他有 Catalyst::Authentication::Credential::HTTP 的模块。象其它 Catalyst tools 他都能配置认证的功能,有简单的复杂的。也有能使用凭证的(如何验证:基本认证或摘要认证)和存储(如何授权的用户名和密码)。
还有象别的方法,你能在你的 web 服务器层来完成这个功能。如果你运行你的应用是使用的 Apache 的 mod_perl ,你就可以使用 Apache 的 mod_auth 的模块来实现认证的功能。但这只能是有限的能力。要实现复杂的认证比如通过 database 中的信息来认证。就需要自己来写模块实现了。
Plack 中间件允许 Web 应用程序框架共享这样的功能,大多是一个非常简单的 Perl 回调, Plack::Middleware::Auth::Basic 只完成一个基本的身份验证。这就是为什么大多数 Plack 后端服务器都没有一个认证系统的原因,因为只要使用中间件组件就能实现了。
Using Plack::Middleware::Auth::Basic
象其它的中间件,使用 Auth::Basic 也是快速又简单的。
use Plack::Builder; my $app = sub { ... }; builder { enable "Auth::Basic", authenticator => sub { my($username, $password) = @_; return $username eq 'admin' && $password eq 'foobar'; }; $app; };
这样你就加入了一个基本的认证在你的 $app 的应用中,使用用户名叫 admin 和使用密码为 foobar 。如果正常的进入可以通过 PSGI 中的 $env 环境变量取得 REMOTE_USER 的变量中的用户名。
这是基于回调的应用,象要增加其它的认证的方法,如 Kerberos ,只需要使用 Authen::Simple 就行。
use Plack::Builder; use Authen::Simple; use Authen::Simple::Kerberos; my $auth = Authen::Simple->new( Authen::Simple::Kerberos->new(realm => ...), ); builder { enable "Auth::Basic", authenticator => sub { $auth->authenticate(@_): }; $app; };
我们可以见到,使用了这个 Authen::Simple 来做后端服务的认证,只需要很小的改变。
当使用了 URLMap 时怎么办?
URLMap 可以混合多个应用成一个应用,我们可以绑定认证的中间件到其中一个应用。使用认证和不使用认证只有少量的不同,如下:
use Plack::Builder; my $app = sub { my $env = shift; if ($env->{REMOTE_USER}) { # Authenticated } else { # Unauthenticated } }; builder { mount "/private" => builder { enable "Auth::Basic", authenticator => ...; $app; }; mount "/public" => $app; };
这时,你打开相同的应用 $app ,只要通过不同的路径 "/public" 和 "/private" 就行。这时打开 /private 会需要认证。才能取得 $env->{REMOTE_USER}。上面这种写法并不建议,只是一个例子。
这是我的译文,原文地址:http://advent.plackperl.org/2009/12/day-15-authenticate-your-app-with-middleware.html
建议继续学习:
- 中间件和稳定性平台 (阅读:5382)
- Apache Avro 与 Thrift 比较 (阅读:4503)
- GINA 与 pGINA――实现自定义的 Windows 用户身份认证 (阅读:4077)
- 一个登陆认证系统 (阅读:3617)
- 国内互联网公司数据库访问层调查 (阅读:3118)
- 2012年数据库技术大会 百度和淘宝介绍的中间件对比 (阅读:3104)
- Apache用户认证方法汇总 (阅读:2580)
- 探索MySQL源代码-客户端连接过程和用户认证体系 (阅读:2311)
- 在你的应用中添加 JSONP 的支持 (阅读:2168)
- 根据条件来加载中间件 (阅读:1705)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:扶凯 来源: 扶凯
- 标签: 中间件 认证
- 发布时间:2011-08-19 23:16:59
- [66] Oracle MTS模式下 进程地址与会话信
- [66] Go Reflect 性能
- [65] 如何拿下简短的域名
- [59] android 开发入门
- [59] 图书馆的世界纪录
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [46] 读书笔记-壹百度:百度十年千倍的29条法则