Perl Dancer2身份验证密码管理

时间:2017-08-30 02:03:39

标签: perl authentication hash passwords dancer

所以使用perl舞者的任何人都知道要在登录时验证用户,你可以调用authenticate_user

authenticate_user(
    params->{username}, params->{password}
);

这是Auth :: Extensible插件的一部分。

对我而言,它似乎鼓励使用纯文本存储密码!当然你可以先将密码哈希,然后确保存储的密码是相同的哈希值,但这似乎更像是一种解决方法,我发现它并不能保证工作。我只能使用不应该使用的sha1来工作。我想使用Bcrypt,但密码根本不匹配。可能奇怪的字符不匹配我不确定。

事情是使用舞者Passphrase插件我已经可以验证用户名和密码,甚至不需要依赖authenticate_user来验证它们。但是对于舞者框架来考虑登录的用户,你仍然必须调用authenticate_user,必须传递密码。

我完全卡住了。我很好奇其他人如何设法在dancer2中使用正确的密码管理?

2 个答案:

答案 0 :(得分:1)

Dancer2::Plugin::Auth::Extensible的文档中,authenticate_user()的说明为:

  

通常你会想让内置的登录处理代码处理验证用户,但是如果你需要自己做,这个关键字接受用户名和密码......

对我来说,强烈暗示你根本不应该调用这个功能,除非你做的事特别聪明。

我自己没有使用过这个模块,但在我看来,所有的散列和加密内容都应由authentication providers中的一个处理,如果没有一个覆盖你使用的情况,那么你可以write one yourself

每当我需要为Dancer应用程序存储安全密码时,我都会找到Dancer2::Plugin::Passphrase。我想知道是否应该考虑为它编写一个Auth :: Extensible样式身份验证提供程序。

答案 1 :(得分:1)

首先,我会回应“您几乎肯定不需要使用authenticate_user()”评论。该插件可以为您处理所有这些。

然而,“它不散列它”是错误的;这是它的工作原理。该 authenticate_user关键字循环遍历所有配置的身份验证领域,并且用于 每一个,询问提供者的authenticate_user()方法,看它是否接受 用户名和密码。 Database提供程序(和其他人)获取 从数据库中记录,并使用$self->match_password()(来自 Provider role)验证它;该代码检查是否存储密码 数据库以{scheme}开头,如果是,则使用 Crypt::SaltedHash->validate验证用户提供的密码(在 纯文本,因为它只是通过电线进入)匹配存储的,哈希 密码($correct在下面的代码中是存储的密码):

if ( $correct =~ /^{.+}/ ) {

    # Looks like a crypted password starting with the scheme, so try to
    # validate it with Crypt::SaltedHash:
    return Crypt::SaltedHash->validate( $correct, $given );
}

所以,是的,如果您在数据库中存储的密码是经过哈希处理的,那么它将匹配 如果提供的密码与该哈希匹配。

有关存储的散列密码应该是什么样子的示例,请点击此处 捆绑的generate-crypted-password实用程序的输出:

[davidp@supernova:~]$ generate-crypted-password 
Enter plain-text password ?> hunter2
Result: {SSHA}z9llSLkkAXENw8FerEchzRxABeuJ6OPs

有关哪些算法的详细信息,请参阅Crypt::SaltedHash doco 由它支持,以及它使用的格式(“来自RFC-3112和 通过使用不同的数字算法来扩展“)。

请记住,authenticate_user背后的代码正是所使用的代码 在你的引擎盖下。

有关让插件为您完成工作的示例,请考虑:

get '/secret' => require_login sub {
    my $user = logged_in_user();
    return "Hi, $user->{username}, let me tell you a secret";
};

......就是这样。 require_login表示插件会检查 如果用户已登录,如果没有,则将其重定向到登录页面 登录。您不需要自己致电authenticate_user 不需要设置任何会话变量或任何东西。 logged_in_user() 将返回有关已登录用户的信息的hashref(并且因为 路线代码有require_login,保证会有一个 点,所以你不需要检查。)

如果你需要检查他们是否有合适的角色,而不仅仅是他们 已登录,请查看文档中的require_role