技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统架构 --> 通过中间件来实现应用的认证

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

浏览:1605次  出处信息

目前有大量的 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. 中间件和稳定性平台    (阅读:5411)
  2. Apache Avro 与 Thrift 比较    (阅读:4522)
  3. GINA 与 pGINA――实现自定义的 Windows 用户身份认证    (阅读:4083)
  4. 一个登陆认证系统    (阅读:3644)
  5. 国内互联网公司数据库访问层调查    (阅读:3135)
  6. 2012年数据库技术大会 百度和淘宝介绍的中间件对比    (阅读:3119)
  7. Apache用户认证方法汇总    (阅读:2618)
  8. 探索MySQL源代码-客户端连接过程和用户认证体系    (阅读:2322)
  9. 在你的应用中添加 JSONP 的支持    (阅读:2173)
  10. 根据条件来加载中间件    (阅读:1711)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1