4

我开发和维护一个用 Perl/Catalyst 编写的客户门户。我们使用 Catalyst 身份验证插件(带有 LDAP 存储后端,加上一些 deny_unless 规则以确保正确的人拥有正确的组成员身份)。

通常,在管理客户的权限时,我们需要在移交之前测试用户的设置。目前,我们唯一的办法是重置用户密码并自己登录,但这并不理想,特别是如果用户已经设置了自己的密码等。

我的问题是:对于 Catalyst,有没有人遇到过一种模拟用户帐户的方法,这样,在给定正确的超级管理员权限的情况下,可以在测试设置时临时模拟另一个帐户,然后在完成后退出?

如果不在 Catalyst 中,那么人们是如何在其他框架或他们自己的自定义解决方案中解决这个问题的?诚然,这为 Web 应用程序引入了潜在的严重攻击向量,但如果被迫实施,人们是如何为此设计的?也许是一些严肃的cookie-session-fu?或者可能是实际 ID/有效 ID 系统?

4

1 回答 1

5

我们使用自定义身份验证器控制器、自定义用户类 (MyApp::Core::User) 和几个领域:

package MyApp::Controller::Auth;
...
sub surrogate : Local {
    my ( $self, $c ) = @_;
    my $p = $c->req->params;
    my $actual_user = $c->user; # save it for later

    try {
        $c->authenticate({ id=>$p->{surrogate_id} }, 'none');
        $c->session->{user} = new MyApp::Core::User( 
             active_user    => $actual_user, 
             effective_user => $c->user );
        $c->stash->{json} = { success => \1, msg => "Login Ok" };
    } catch {
        $c->stash->{json} = { success => \0, msg => "Invalid User" };
    };
    $c->forward('View::JSON');  
}

myapp.conf我使用这样的东西:

<authentication>
    default_realm ldap
    <realms>
        <ldap>
             # ldap realm config stuff here
        </local>
        <none>
            <credential>
                class Password
                password_field password
                password_type none
            </credential>
            <store>
                class Null
            </store>
        </none>
     </realms>
</authentication>

这样我们就创建了一个普通的 Catalyst 用户对象,但是将它包装在我们的自定义用户类周围以获得更多控制。我可能已经创建了一个专门的代理领域,但我选择使用我自己的用户类。它是在不久前完成的,我记得我们为什么这样做。

于 2011-02-27T21:29:10.193 回答