IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

通过中间件来实现应用的认证

扶凯 2011-08-19 23:16:59 累计浏览 2,605 次
本机暂存

目前有大量的 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

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 微信扫码登录网页实现原理 (累计阅读 17,467)
  2. Mac下使用SecureCRT的一些记录 (累计阅读 7,872)
  3. 微信二维码登录的原理 (累计阅读 6,792)
  4. 为什么要用公钥/私钥而不是密码去做SSH身份验证 (累计阅读 5,793)
  5. 为什么要登录? (累计阅读 5,060)
  6. Git安装使用手记 (累计阅读 5,054)
  7. 2012年数据库技术大会 百度和淘宝介绍的中间件对比 (累计阅读 3,999)
  8. 【社会化设计】自我(self)部分――用户登录之后 (累计阅读 3,945)
  9. 级联多个应用 (累计阅读 3,608)
  10. 韩国实名制的破产 (累计阅读 3,505)