所以使用perl舞者的任何人都知道要在登录时验证用户,你可以调用authenticate_user
authenticate_user(
params->{username}, params->{password}
);
这是Auth :: Extensible插件的一部分。
对我而言,它似乎鼓励使用纯文本存储密码!当然你可以先将密码哈希,然后确保存储的密码是相同的哈希值,但这似乎更像是一种解决方法,我发现它并不能保证工作。我只能使用不应该使用的sha1来工作。我想使用Bcrypt,但密码根本不匹配。可能奇怪的字符不匹配我不确定。
事情是使用舞者Passphrase插件我已经可以验证用户名和密码,甚至不需要依赖authenticate_user来验证它们。但是对于舞者框架来考虑登录的用户,你仍然必须调用authenticate_user,必须传递密码。
我完全卡住了。我很好奇其他人如何设法在dancer2中使用正确的密码管理?
答案 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
。