2011-02-27 60 views
4

我开发并维护用Perl/Catalyst编写的客户门户。我们利用Catalyst身份验证插件(带有LDAP存储后端,再加上一些deny_unless规则来确保正确的人员具有正确的组成员身份)。“su”等同于Web应用程序认证,设计问题

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

我的问题是这样的:对于Catalyst,有任何人遇到假冒用户帐户的方法,以便在给出正确的超级管理权限的情况下,可以在测试设置时暂时伪装另一个帐户,然后在完成后退出?

如果不是在Catalyst中,那么人们在其他框架或他们自己的定制解决方案中是如何接近这一点的?无可否认,这是一种为Web应用程序引入潜在恶意攻击媒介的东西,但如果被迫实施,人们是如何为此接近设计的?也许一些严重的cookie会话fu?或者可能是一个actualID/effectiveID系统?

回答

5

我们使用自定义的验证器控制器,一个自定义用户类(MyApp的核心:: ::用户)和几个领域:

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用户对象,但将它包裹在我们的自定义用户类中以获得更多控制权。我可能可以创建一个用于替代的专门领域,但我选择使用自己的用户类。这是一段时间以前的事情,我可以回想起为什么我们这样做了。

+0

噢,这很聪明。那么我想你可以锁定对特殊代理控制器的访问权限,并且你可以模拟一个用户,直到你决定注销或以其他方式终止你的会话。我非常喜欢那个。感谢分享。 – Kaiden 2011-02-27 23:52:05

+0

是的,我没有在我的答案中指定代理控制器的授权控制。您可以使用您的应用中其他位置的任何内容。能够在应用程序内进行代理的能力实际上非常酷,对调试用户问题很有用。只要确定你记录谁在冒充谁,以防系统被高级用户滥用。 – ojosilva 2011-02-28 00:26:51